Почему пустой массив UIDragItem по-прежнему позволяет перетаскивать строки?
Реализация iOS 11 Drag and Drop в табличном представлении. Если я не хочу, чтобы перетаскивалась первая строка, я предполагаю, что возвращаю пустой массив из tableView(:itemsForBeginning:)
func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
if indexPath.row == 0 {
return []
}
let dragItems = self.dragItems(forRowAt: indexPath)
print("dragging row index \(String(describing: dragItems.first?.localObject as? Int))")
return dragItems
}
Возврат пустого массива, если вы не разрешаете пользователю перетаскивать содержимое из указанного пути индекса.
Но даже когда подтверждается, что [ ] возвращается, перетаскивание все равно происходит. Это означает, что либо я облажался, либо функция не реализована так, как задокументировано. Я всегда не решаюсь думать, что это кто-то другой, поэтому мой вопрос заключается в том, должно ли возвращение [ ], как оно реализовано, на самом деле предотвратить перетаскивание строки 0? Кто-нибудь еще подтвердит это или покажет, что он работает как задокументировано?
Спасибо
Изменить: Пример кода из видео WWDC включает в себя этот кусок:
if tableView.isEditing {
// User wants to reorder a row, don't return any drag items. The table view will allow a drag to begin for reordering only.
return []
}
Означает ли это, что если вы не вернете какие-либо элементы перетаскивания, табличное представление все равно позволит перетаскивать?!?! Тогда как можно предотвратить перетаскивание строки?
1 ответ
Спасибо @Losiowaty за указание в полезном направлении.
Я знал, что в tableView делегат удаления будет выглядеть tableView(:moveRowAt:)
если бы был только один UIDragItem
, То, что я нигде не видел, было задокументировано, что это также проверено с tableView(:canMoveRowAt:)
хотя теперь это кажется очевидным в ретроспективе.
мой canMoveRowAt
выглядело так:
// Override to support conditional rearranging of the table view.
override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
// Return false if you do not want the item to be re-orderable. If coded that the first row is non-editable, that row is by definition also non-re-orderable
return true
}
Обратите внимание на комментарий внутри метода. Я не знаю, написал ли я комментарий или скопировал его откуда-то. Я предотвратил редактирование строки 0 (ее можно изменить и изменить в режиме редактирования) и переопределить canMoveRowAt
, но это игнорируется с iOS 11 перетаскивания видимо. Таким образом, решение должно быть явным, как в:
// Override to support conditional rearranging of the table view.
override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
// Return false if you do not want the item to be re-orderable.
if indexPath.row == 0 {return false}
return true
}
Дополнительная сложность в диагностике заключается в том, что тот же код в приложении iMessage на iPad не достигает tableView(:moveRowAt:)
Дошел туда на айфоне. Для приложения iOS tableView(:moveRowAt:)
достигается на iPad и iPhone, хотя это может быть отдельной проблемой.