使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)