如何在点击TableCell时从一个.xib(TableCell.xib)到另一个.xib(UIViewController)执行segue?
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print(results?[indexPath.row]) // prints successfully
...
// apply below chunks here...
}
首先,我尝试在Storyboard中设置手动segue。请注意,TableView& TableViewCell是外部xib,但TableView的父级是在Storyboard中。所以,我尝试从parent-ViewController控件拖动到detailViewController(和标识符:showDetails)。但是,不起作用。
...
NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
self.performSegueWithIdentifier("showDetails", sender: AnyObject?())
})
...
显然,我收到了这个错误(因为TableView在.xib中,而parent和detailsVC在Storyboard中,我按住Ctrl +从parentVC拖到detailsVC但TableView1显然没有识别主故事板中的segue):
TableView1:0x7f97626a3280>)没有带标识符的segue' showDetails''
然后我尝试创建一个ViewController并尝试在顶部添加var parentNavigationController : UINavigationController!
并在didSelectRowAtIndex
...
let newVC : UIViewController = CellDetailsVC()
newVC.title = "DetailsView"
print(newVC)
parentNavigationController!.pushViewController(newVC, animated: true)
但是,我收到一个错误:
DetailsVC:0x7ff7794ae550> 致命错误:在解包可选值时意外发现nil
最后,我还尝试了didSelectRowAtIndex
里面的chunk,并得到了一些接近(因为我可以使用dismissView来< Back
);但不完全是我想要的。它的问题是segue动画看起来像是从底部来的。
...
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("VideoDetailsVC") as UIViewController
self.presentViewController(vc, animated: true, completion: nil)
}
我也收到警告(但没有崩溃)由于某种原因我无法弄清楚:
不建议在分离的视图控制器上显示视图控制器
哪种方法合适?或者有更好的方法来适应我想要达到的目标吗?
首先,从didSelectRowAtIndex (in TableView.xib class)
到新的ViewController(Storyboard或xib)执行segue的正确方法是什么?
其次,假设TableViewCell.xib
中有图像缩略图。在点击该视图时,对新UIView执行segue的正确方法是什么? (如全屏图像/可忽略)
答案 0 :(得分:3)
你的第二种方法看起来是正确的,但当然你在那里做错了。您需要将Segue从Parent ViewController拖放到Detail ViewController并在Storyboard中为其指定Segue标识符(请查看下面附带的图像)。在didSelectRowAtIndexPath中你需要做以下代码:
self.performSegueWithIdentifier("showDetailViewController", sender: nil)
我可以看到你已经尝试过,但看起来你错过了一些设置Segue Identifier或在performSegueWithIdentifier方法中给出错误标识符的步骤。你的Parent ViewController也应该嵌入UINavigationController,以防你错过那个东西:)
另请注意,您应该从一个ViewController到同一级别的另一个ViewController执行导航(此处为Segue),而不是从一个View到另一个ViewController。