在 Swift 中从 TableView 转到导航控制器

Segue from TableView to Navigation Controller in Swift

我目前有一个导航控制器,它指向 table 视图,显示我当前正在聊天的所有人 (ChatroomTableViewController)。单击 table 视图中的其中一条消息后,我将进入实际消息并进入视图控制器 (MessageViewController)。

问题:我现在需要一个后退按钮MessageViewController,这意味着我现在需要添加一个导航控制器。这是我当前的代码(因为 MessageViewController 前面没有导航控制器):

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let sb = UIStoryboard(name: "Main", bundle: nil)
    let messagesVC = sb.instantiateViewControllerWithIdentifier("MessageViewController") as! MessagesViewController
    //Some code here
    let room = results?.last as! PFObject
    messagesVC.room = room
}

我想实例化将指向 MessageViewController 的导航控制器,而不是实例化 MessageViewController。

尝试:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let sb = UIStoryboard(name: "Main", bundle: nil)
    let messagesVC = sb.instantiateViewControllerWithIdentifier("NavigationViewController") as! UINavigationController
    //Some code here
    let room = results?.last as! PFObject
    messagesVC.room = room //ERROR! "UINavigationController does not have a member named 'room'"

我该如何解决?

你可以这样做:

let navigationVC = sb.instantiateViewControllerWithIdentifier("NavigationViewController") as! UINavigationController
let messagesVC = naviagionVC.viewControllers[0] as! MessagesViewController
let room = results?.last as! PFObject
messagesVC.room = room

这是假设您的 MessagesViewController 是您设计的 rootViewController

编辑

导航控制器的工作原理如下:假设您有一个视图控制器层次结构:AViewController - BViewControler - CViewController,您希望将其嵌入到导航控制器中。你所做的是,你创建一个导航控制器并使 AViewController 成为 rootViewController 然后 "push" BViewController 和后来的 CViewControllerBViewControlerCViewControler 都会得到后退按钮; AViewController 不是,因为它是根。

在您的情况下,具有 table 视图的 VC 应该是 rootViewController。在点击单元格时,您应该按下 MessagesViewController,它将有一个后退按钮,点击它会弹出到您当前的视图控制器。