UISplitViewController Проведите пальцем по деталям Навигация назад и вперед - PullRequest
0 голосов
/ 19 сентября 2018

Начиная с проекта 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 он выдвигает, без замены, новый детальный контроллер.

Я не понимаю, как тот же код, работающий в той же ОС, имеет такое странное поведение.Я предполагаю, что это ошибка, которая потребует какого-то обходного пути.Есть предложения?

...