使用 performSegueWithIdentifier 传递数据 nil

Posted

技术标签:

【中文标题】使用 performSegueWithIdentifier 传递数据 nil【英文标题】:passing data with performSegueWithIdentifier nil 【发布时间】:2016-06-02 02:07:16 【问题描述】:

我的 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")

    

还有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
        
    

但是,目标控制器的对象friendChat(在controller.friendChat 中看到)始终为零。

如何传递数据:

        controller.friendChat = friendChat
        controller.senderId = Global.sharedInstance.userID
        controller.senderDisplayName = Global.sharedInstance.userName

成功到目标控制器?

【问题讨论】:

您在didSelectRowAtIndexPath 中所做的第一件事是取消选择该行,因此当您尝试访问prepareForSegue 中的选定行时,您将不会选择任何行。您在performSegueWithIdentifier 中将friendChat 作为您的发件人传递给prepareForSegue,您可以只说let friendChat = sender as? Friend 谢谢,成功了!如果你想写一个答案 Sender 需要是 UIView 或 UIViewController 它不应该用于传递数据对象。 【参考方案1】:

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

由于您将Friend 实例作为您的sender 传递给performSegueWithIdentifier,您可以在prepareForSegue 中说let friendChat = sender as? Friend

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
        
    

对于 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
        
    

【讨论】:

好答案。 (已投票。)处理此问题的另一种方法是将选定的行(或行和部分,如果需要)保存到didSelectRowAtIndexPath 中的实例变量中,然后在 preapareForSegue 中使用该行。第三种方法是不取消选择didSelectRowAtIndexPath 中的行。那么表格视图的indexPathForSelectedRow 仍然有效。

以上是关于使用 performSegueWithIdentifier 传递数据 nil的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)