从默认的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)
并用手动触发segue代替:
self.performSegue(withIdentifier: "showDetail", sender: nil)
现在这是奇怪的部分。在iPad上,任何方向的一切都可以按预期工作,但在iPhone上则不能。在iPad上滑动时,它只是将明细视图替换为包含新数据的视图。在iOS上,它会推送而不替换新的细节控制器。
我不明白在同一操作系统上运行的相同代码如何具有这种奇怪的行为。我假设这是一个错误,将需要某种解决方法。有什么建议吗?