【问题标题】:passing data with performSegueWithIdentifier nil使用 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 它不应该用于传递数据对象。

标签: ios swift segue


【解决方案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 仍然有效。
猜你喜欢
  • 2016-01-10
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 2014-07-22
  • 2011-07-22
相关资源
最近更新 更多