如何从情节提要属性为 nil 的动态创建的 UIViewController 执行SegueWithIdentifier()
Posted
技术标签:
【中文标题】如何从情节提要属性为 nil 的动态创建的 UIViewController 执行SegueWithIdentifier()【英文标题】:How to performSegueWithIdentifier() from dynamically created UIViewController whose storyboard property is nil 【发布时间】:2016-05-13 12:04:22 【问题描述】:我正在开发一个具有搜索功能的项目。我有 3 个视图控制器,即 HomeViewController、SearchResultViewController 和 DetailViewController。
在主页上,我在导航栏中有一个搜索栏(使用UISearchController)以及一些虚拟内容。这里重要的是我使用单独的控制器(在我的例子中是 SearchResultController)来显示结果。这个 SearchResultController 实际上是 TableViewController 的子类,它在 tableview 中显示结果。到这里为止一切正常。
问题
现在,当我从结果中选择任何行时(即在 SearchResultViewController 中),我想打开另一个视图控制器 (DetailViewController),我将在其中显示有关此选定项目的详细信息。这是一件非常简单的事情,但我被困在这里。
好的,继续我已经实现的 didSelectRowAtIndexPath 方法的问题,然后我调用 performSegueWithIdentifier 并收到错误“Receiver has no segue with identifier”,因为情节提要属性为 nil (文档中有提到)。
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
print("storyboard property is \(self.storyboard)")
performSegueWithIdentifier(segueIdentifier, sender: indexPath.row)
注意: segueIdentifier 与故事板上的相同。 我得到那个故事板属性为零。
我猜
当我点击搜索栏时,ios 会在内部创建并加载 SearchResultController 的实例以显示结果,因此它的故事板属性为 nil,因此我收到了上述错误。
有人可以解决这个问题或任何指向正确方向的指针。
【问题讨论】:
在这种情况下你不需要 segue,只需实例化视图控制器并呈现它 你不能继续在故事板创建实例中没有定义的内容,只能从导航中推送或呈现它 @Scriptable 是的,刚刚使用了 presentViewController() 并且工作正常。谢谢 【参考方案1】:如果您以编程方式创建视图控制器,那么您应该推入导航控制器,例如,
UIViewController *vc = [[UIViewController alloc]init]; //your viewcontroller here
[self.navigationController pushViewController:vc animated:YES];
//or if you want to present it then
[self presentViewController:vc animated:YES completion:nil];
你不能执行segue,因为没有故事板就没有segue
在 swift 中是这样的
let vc: UIViewController = UIViewController()
//your viewcontroller here
self.navigationController!.pushViewController(vc, animated: true)
//or if you want to present it then
self.presentViewController(vc, animated: true, completion: _ in )
在swift中避免任何错误!!!
希望这会有所帮助:)
【讨论】:
以上是关于如何从情节提要属性为 nil 的动态创建的 UIViewController 执行SegueWithIdentifier()的主要内容,如果未能解决你的问题,请参考以下文章