使用委托传递变量
Using A Delegate to Pass a var
我一直在努力让这个 'Delegate' 东西在我正在开发的应用程序 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
按钮 return 我的 CreateEvent
视图。
var contactSelection: ContactSelectionViewController = ContactSelectionViewController()
这是直接实例化视图控制器,永远不会使用该值。由于看起来您正在使用情节提要,这不是一个好主意,因为 none 的出口将被连接并且您将获得可选的解包崩溃。您设置了此视图控制器的委托,但这无关紧要,因为它没有被使用。
这也不是一个好主意,因为如果你进行多次推送,你将重复使用同一个视图控制器,这最终会导致错误,因为你会有以前使用的遗留状态,这可能会给你带来意想不到的结果结果。最好每次都创建一个新的视图控制器来推送。
在您的代码中,您正在从情节提要中制作一个全新的 contactSelection
并在不设置委托的情况下推送它。
您需要在要推送到导航堆栈的实例上设置委托。
在委托方法中传回可用于提取值的引用也很有帮助,而不是像您正在做的那样依赖 var
中的单独引用。
所以,我会执行以下操作:
- 删除
var contactSelection
- 在推送新的
contactSelection
对象之前添加委托
将委托方法签名更改为:
protocol ContactSelectionDelegate {
func updateInvitedUsers(contactSelection:ContactSelectionViewController)
}
将您的委托调用更改为:
self.delegate?.updateInvitedUsers(self)
我一直在努力让这个 'Delegate' 东西在我正在开发的应用程序 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
按钮 return 我的 CreateEvent
视图。
var contactSelection: ContactSelectionViewController = ContactSelectionViewController()
这是直接实例化视图控制器,永远不会使用该值。由于看起来您正在使用情节提要,这不是一个好主意,因为 none 的出口将被连接并且您将获得可选的解包崩溃。您设置了此视图控制器的委托,但这无关紧要,因为它没有被使用。
这也不是一个好主意,因为如果你进行多次推送,你将重复使用同一个视图控制器,这最终会导致错误,因为你会有以前使用的遗留状态,这可能会给你带来意想不到的结果结果。最好每次都创建一个新的视图控制器来推送。
在您的代码中,您正在从情节提要中制作一个全新的 contactSelection
并在不设置委托的情况下推送它。
您需要在要推送到导航堆栈的实例上设置委托。
在委托方法中传回可用于提取值的引用也很有帮助,而不是像您正在做的那样依赖 var
中的单独引用。
所以,我会执行以下操作:
- 删除
var contactSelection
- 在推送新的
contactSelection
对象之前添加委托 将委托方法签名更改为:
protocol ContactSelectionDelegate { func updateInvitedUsers(contactSelection:ContactSelectionViewController) }
将您的委托调用更改为:
self.delegate?.updateInvitedUsers(self)