【问题标题】:Performing Segue from - TableViewCell.xib to UIView - and - TableView.xib to UIViewController -从 - TableViewCell.xib 到 UIView - 和 - TableView.xib 到 UIViewController - 执行 Segue
【发布时间】:2015-12-07 08:20:56
【问题描述】:

如何在点击 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 中设置手动转场。请注意,TableView 和 TableViewCell 是外部 xib,但 TableView 的父级在 Storyboard 中。因此,我尝试将控件从父 ViewController 拖动到 detailViewController(和标识符:showDetails)。但是,不起作用。

      ...
        NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
            self.performSegueWithIdentifier("showDetails", sender: AnyObject?())
        })
      ...

显然,我收到了这个错误(因为 TableView 在 .xib 中,而 parent 和 detailsVC 在 Storyboard 中,我 ctrl+从 parentVC 拖到 detailsVC 但 TableView1 显然无法识别 Main Storyboard 中的 segue):

TableView1: 0x7f97626a3280>) 没有标识符为“showDetails”的segue


然后我尝试创建一个 ViewController 并尝试在顶部添加 var parentNavigationController : UINavigationController! 并在 didSelectRowAtIndex 内引用下面的块

   ...
     let newVC : UIViewController = CellDetailsVC()
     newVC.title = "DetailsView"
     print(newVC)

     parentNavigationController!.pushViewController(newVC, animated: true)

但是,我收到一个错误:

详细信息VC:0x7ff7794ae550> 致命错误:在展开可选值时意外发现 nil


最后,我还尝试了didSelectRowAtIndex 中的以下块,并且得到了一些接近的结果(因为我可以使用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 的正确方法是什么? (如全屏图像/可关闭)

【问题讨论】:

  • 如何获得 parentNavigationController ?
  • 在TableView.xib类的开头添加var parentNavigationController : UINavigationController!
  • 将其视为一个社交平台。将 TableView 视为新闻提要。 1)点击用户名->执行segue到新的VC显示配置文件。 2)点击图像缩略图 - >全屏UIView。 3)点击单元格(其他任何地方) - 对另一个 UIViewController 执行另一个 segue。那么在我的情况下没有办法实现它吗?
  • 抱歉.. 我是 Swift 新手。但是正如我在这里看到的,您正在声明 NavigationController.. 您在哪里分配或获取 NavigationController 实例?是的,您可以实现这种流程。

标签: ios swift uitableview uiviewcontroller segue


【解决方案1】:

您的第二种方法看起来是正确的,但您当然在那里做错了什么。您需要将 Segue 从 Parent ViewController 拖放到 Detail ViewController 并在 Storyboard 中给它一个 Segue 标识符(检查下面的附加图片)。在 didSelectRowAtIndexPath 中,您需要执行以下代码:

    self.performSegueWithIdentifier("showDetailViewController", sender: nil)

我可以看到你已经尝试过了,但看起来你错过了一些步骤,要么设置 Segue Identifier,要么在 performSegueWithIdentifier 方法中提供错误的标识符。此外,您的父 ViewController 应该嵌入 UINavigationController 中,以防您丢失该东西:)

另外请记住,您应该执行从一个 ViewController 到同一级别的另一个 ViewController 的导航(这里是它的 Segue),而不是从一个 View 到另一个 ViewController。

【讨论】:

  • `由于未捕获的异常“NSInvalidArgumentException”导致应用程序终止,原因:“接收 TableView1: >) 与标识符“showDetailVC”没有任何关联,因为 parentVC 在故事板中,但 TableView 在 xib 文件中。因此,在 Storyboard 中,从 parentVC 拖动到 detailVC 并添加 segue 是可以的,但 TableView1 显然无法识别它。所以不幸的是,你的答案并不能解决问题。你还有什么想法吗?
  • 你的应用结构不合适。您的 tableview 不需要 Segue。您介意分享一下您是如何将 tableview 添加到 ParentViewController 的吗?要在 ParentViewController 中添加 tableview,您只需将 UITableView 拖放到控制器中。您应该执行从一个 ViewController 到另一个 ViewController 的导航(这里是它的 Segue),而不是从一个 View 到另一个 ViewController。
  • 您想使用 zoom.us 还是 skype 进行屏幕共享? (您可以使用 zoom.us 控制我的鼠标/键盘)。这个项目很简单。所以我们可以很容易地找出问题所在。因为我的应用程序正在使用 rest-api (+ localhost) 并且您希望能够在不调整的情况下运行它
猜你喜欢
  • 1970-01-01
  • 2019-03-17
  • 2010-11-23
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多