我一直在努力让这个“代表”的东西在Swift中为我正在开发的应用程序工作。
我有两个文件:CreateEvent.swift
和ContactSelection.swift
,前者称之为后者。
CreateEvent
的内容是:
class CreateEventViewController: UIViewController, ContactSelectionDelegate {
/...
var contactSelection: ContactSelectionViewController = ContactSelectionViewController()
override func viewDidLoad() {
super.viewDidLoad()
/...
contactSelection.delegate = self
}
func updateInvitedUsers() {
println("this finally worked")
}
func inviteButton(sender: AnyObject){
invitedLabel.text = "Invite"
invitedLabel.hidden = false
toContactSelection()
}
/...
func toContactSelection() {
let contactSelection = self.storyboard?.instantiateViewControllerWithIdentifier("ContactSelectionViewController") as ContactSelectionViewController
contactSelection.delegate = self
self.navigationController?.pushViewController(contactSelection, animated: true)
}
ContactSelection
的内容是:
protocol ContactSelectionDelegate {
func updateInvitedUsers()
}
class ContactSelectionViewController: UITableViewController {
var delegate: ContactSelectionDelegate?
override func viewDidLoad() {
super.viewDidLoad()
self.delegate?.updateInvitedUsers()
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// Stuff
self.delegate?.updateInvitedUsers()
}
}
我做错了什么?我仍然是新人,并不完全理解这个主题,但在搜索互联网后,我似乎无法找到答案。我使用导航栏中的Back
按钮返回我的CreateEvent
视图。
答案 0 :(得分:2)
var contactSelection: ContactSelectionViewController = ContactSelectionViewController()
这是直接实例化视图控制器,并且永远不会使用该值。由于您看起来像是在使用故事板,因此这不是一个好主意,因为没有任何插座可以连接,您可以获得可选的展开崩溃。您设置了此视图控制器的委托,但由于它没有被使用,因此无关紧要。
这也不是一个好主意,因为如果您多次推送,您将重复使用相同的视图控制器,这最终会导致错误,因为您将从以前的使用中获得剩余状态给你意想不到的结果。最好每次创建一个新的视图控制器来推送。
在您的代码中,您从故事板中创建一个全新的contactSelection
并在不设置委托的情况下推送它。
您需要在您正在推送到导航堆栈的实例上设置委托。
在委托方法中传回一个可用于提取值的引用也很有帮助,而不是依赖于var
中的单独引用,就像您正在做的那样。
所以,我要做以下事情:
var contactSelection
contactSelection
对象将委托方法签名更改为:
protocol ContactSelectionDelegate {
func updateInvitedUsers(contactSelection:ContactSelectionViewController)
}
将您的委托调用更改为:
self.delegate?.updateInvitedUsers(self)