使用委托传递变量

Using A Delegate to Pass a var

我一直在努力让这个 'Delegate' 东西在我正在开发的应用程序 Swift 中工作。

我有两个文件:CreateEvent.swiftContactSelection.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)