我在通用应用中设置了UISplitViewController
。它大部分工作正常,但我有一个小问题。
iPhone - 仅适用于Portrait并正确加载MasterVC
(tableview)
iPad - 适用于人像和风景
加载屏幕上显示MasterVC
和DetailVC
。这很好,我在viewDidAppear
的{{1}}中运行以下代码,如果存在行,则选择第一行:
MasterVC
我的问题是,如果用户在纵向中使用iPad启动应用程序。
使用private func selectRowOnFirstLoadIfiPad() {
if self.firstLoad && UIDevice.currentDevice().userInterfaceIdiom == .Pad {
if self.fetchedResultsController.sections?.count != nil {
let rowToSelect:NSIndexPath = NSIndexPath(forRow: 0, inSection: 0);
self.myTableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition:UITableViewScrollPosition.None)
self.performSegueWithIdentifier("mySegue", sender: self)
}
self.firstLoad = !self.firstLoad
}
}
,iPad直接转到UISplitViewController
,DetailVC
上的viewDidAppear
永远不会运行(直到用户按下“返回”按钮)。然后MasterVC
滑到屏幕边缘,tableView
最终运行,将用户带到第一行。
如果他们在Portrait中启动iPad,我该如何避免这种情况并立即加载第一行?
由于
答案 0 :(得分:1)
当您执行segue时,我假设您正在根据所选单元格加载详细信息视图。如果是这种情况,请尝试在主视图控制器的performSegueWithIdentifier
中的viewDidLoad
中发送NSIndexPath作为发件人对象。然后在prepareForSegue()中,检查发送方对象是否为NSIndexPath类型,因为storyboard中的segue将是UITableViewCell类。从该NSIndexPath获取行并将内容加载到详细视图中。
然后在viewDidAppear
(仍在主视图控制器中),选择行初始行,使其突出显示。
func viewDidLoad() {
// ...
var initialIndexPath = NSIndexPath(forRow: 0, inSection: 0)
self.performSegueWithIdentifier("mySegue", sender: initialIndexPath)
}
func viewDidAppear(_ animated: Bool) {
// ...
var initialIndexPath = NSIndexPath(forRow: 0, inSection: 0)
self.myTableView.selectRowAtIndexPath(initialIndexPath, animated: true, scrollPosition:UITableViewScrollPosition.None)
}
func prepareForSegue(_ segue: UIStoryboardSegue, sender sender: AnyObject?) {
// ...
if (sender.isKindOfClass(UITableViewCell) {
// Get row from selected row in tableview
} else if (sender.isKindOfClass(NSIndexPath) {
// Get row from sender, which is an NSIndexPath
} else {
// Handle a default case
}
// Prepare the detail view with the index...
}