如何从情节提要属性为 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()的主要内容,如果未能解决你的问题,请参考以下文章

获取使用情节提要创建的视图控制器的属性

Xcode 如何加载主情节提要?

如何以编程方式从情节提要中填充静态 UITableView?

用 XIB 替换情节提要

WPF 动态创建情节提要

如何获取使用情节提要创建的按钮的对象