使用performSegueWithIdentifier nil传递数据

Sau*_*ron -1 ios segue swift

我有segue设置为:

在此输入图像描述

和tableView行选择:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    tableView.deselectRowAtIndexPath(indexPath, animated: true)

    // Ensure controller knows which dataset to pull from,
    // so detail view is correct
    var friendChat: Friend!
    if searchController.active && searchController.searchBar.text != "" {
        friendChat = filterMappedFriends[indexPath.row]
    } else {
        friendChat = mappedFriends[indexPath.row]
    }

    // Now set the conditional cases: if a friend then chat, if user then friend request if not user then can invite them:
    if(friendChat.statusSort == 2) {

        self.performSegueWithIdentifier("showIndividualChat", sender: friendChat)

    } else if (friendChat.statusSort == 1) {

        print("Can invite to be friend")

    } else if (friendChat.statusSort == 0) {

        print("Invite to Feast")

    }
}
Run Code Online (Sandbox Code Playgroud)

和prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if let indexPath = tableView.indexPathForSelectedRow {

        // Ensure controller knows which dataset to pull from,
        // so detail view is correct
        let friendChat: Friend
        if searchController.active && searchController.searchBar.text != "" {
            friendChat = filterMappedFriends[indexPath.row]
        } else {
            friendChat = mappedFriends[indexPath.row]
        }

        // Now set the conditional cases: if a friend then chat, if user then friend request if not user then can invite them:

        if segue.identifier == "showIndividualChat" {

            let controller = segue.destinationViewController as! IndividualChatController
            controller.friendChat = friendChat
            controller.senderId = Global.sharedInstance.userID
            controller.senderDisplayName = Global.sharedInstance.userName
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,对象friendChat,见于controller.friendChat目标控制器,是始终为零.

我如何传递数据:

        controller.friendChat = friendChat
        controller.senderId = Global.sharedInstance.userID
        controller.senderDisplayName = Global.sharedInstance.userName
Run Code Online (Sandbox Code Playgroud)

到目标控制器成功?

Pau*_*w11 5

您正在做的第一件事didSelectRowAtIndexPath是取消选择该行,因此当您尝试访问所选行时,prepareForSegue您将不会选择任何行.

既然你是传递Friend实例作为senderperformSegueWithIdentifier你只能说let friendChat = sender as? FriendprepareForSegue;

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "showIndividualChat" {
        if let friendChat = sender as? Friend {
            let controller = segue.destinationViewController as! IndividualChatController
            controller.friendChat = friendChat
            controller.senderId = Global.sharedInstance.userID
            controller.senderDisplayName = Global.sharedInstance.userName
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于Swift 3

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "showIndividualChat" {
        if let friendChat = sender as? Friend {
            let controller = segue.destination as! IndividualChatController
            controller.friendChat = friendChat
            controller.senderId = Global.sharedInstance.userID
            controller.senderDisplayName = Global.sharedInstance.userName
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 好答案.(已投票.)处理此问题的另一种方法是将所选行(或行和节,如果需要)保存到`didSelectRowAtIndexPath`中的实例变量,然后在preapareForSegue中使用该行.第三种方法是不取消选择`didSelectRowAtIndexPath`中的行.然后表视图的`indexPathForSelectedRow`仍然有效. (2认同)