Начиная с проекта SplitViewController по умолчанию, я добавил жест влево и вправо к подробному виду.Я определил протокол, который реализует главное представление, когда происходит пролистывание влево или вправо.
protocol SwipeDelegate: AnyObject {
func onSwippedLeft()
func onSwippedRight()
}
В MasterViewController реализация onSwippedLeft () продвигает текущий выбранный элемент на единицу:
func onSwippedLeft() {
let currentRow = self.tableView.indexPathForSelectedRow?.row
if currentRow == objects.count - 1 {
print("Already on first item")
return
}
let newIndexPath = IndexPath(row: currentRow! + 1, section: 0)
self.tableView!.selectRow(at: newIndexPath, animated: true, scrollPosition: UITableView.ScrollPosition.middle)
self.tableView(self.tableView, didSelectRowAt: newIndexPath)
}
Проблема возникает, когда я добавляю последнюю строку.Визуально все работает;когда я провожу пальцем влево, я вижу, что выделение в виде таблицы движется вперед;однако в последней строке я пытаюсь выполнить выбор вручную, чтобы по мере продвижения выбранного элемента подробное представление заменялось содержимым этого элемента.
[MasterDetailDefault.MasterViewController tableView:didSelectRowAtIndexPath:]: unrecognized selector sent to instance 0x7fabe28084e0
2018-09-19 09:07:11.618683-0700 MasterDetailDefault[87530:2282523] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MasterDetailDefault.MasterViewController tableView:didSelectRowAtIndexPath:]: unrecognized selector sent to instance 0x7fabe28084e0'
*** First throw call stack:
(
0 CoreFoundation 0x000000011075929b __exceptionPreprocess + 331
1 libobjc.A.dylib 0x000000010fcf5735 objc_exception_throw + 48
2 CoreFoundation 0x0000000110777fa4 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
3 UIKitCore 0x0000000113e9b163 -[UIResponder doesNotRecognizeSelector:] + 287
4 CoreFoundation 0x000000011075dd14 ___forwarding___ + 772
5 CoreFoundation 0x000000011075fe88 _CF_forwarding_prep_0 + 120
6 MasterDetailDefault 0x000000010f3c2971 $S19MasterDetailDefault0A14ViewControllerC13onSwippedLeftyyF + 2321
7 MasterDetailDefault 0x000000010f3c331e $S19MasterDetailDefault0A14ViewControllerCAA13SwipeDelegateA2aDP13onSwippedLeftyyFTW + 30
В чем здесь моя ошибка?
ОБНОВЛЕНИЕ 1
Я сегодня запустил код, ничего не трогал, и этот сбой больше не происходит.Я удалил последнюю строку, как было предложено:
self.tableView(self.tableView, didSelectRowAt: newIndexPath)
и заменил ее на запуск перехода вручную:
self.performSegue(withIdentifier: "showDetail", sender: nil)
Теперь вот странная часть.На iPad теперь все работает, как и ожидалось, в любой ориентации, но не на iPhone.На iPad, когда я провожу пальцем, он просто заменяет экран сведений на новый, содержащий новые данные.На iOS он выдвигает, без замены, новый детальный контроллер.
Я не понимаю, как тот же код, работающий в той же ОС, имеет такое странное поведение.Я предполагаю, что это ошибка, которая потребует какого-то обходного пути.Есть предложения?