使用委托传递变量

时间:2015-01-14 07:51:19

标签: ios swift

我一直在努力让这个“代表”的东西在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按钮返回我的CreateEvent视图。

1 个答案:

答案 0 :(得分:2)

var contactSelection: ContactSelectionViewController = ContactSelectionViewController()

这是直接实例化视图控制器,并且永远不会使用该值。由于您看起来像是在使用故事板,因此这不是一个好主意,因为没有任何插座可以连接,您可以获得可选的展开崩溃。您设置了此视图控制器的委托,但由于它没有被使用,因此无关紧要。

这也不是一个好主意,因为如果您多次推送,您将重复使用相同的视图控制器,这最终会导致错误,因为您将从以前的使用中获得剩余状态给你意想不到的结果。最好每次创建一个新的视图控制器来推送。

在您的代码中,您从故事板中创建一个全新的contactSelection并在不设置委托的情况下推送它。

您需要在您正在推送到导航堆栈的实例上设置委托。

在委托方法中传回一个可用于提取值的引用也很有帮助,而不是依赖于var中的单独引用,就像您正在做的那样。

所以,我要做以下事情:

  • 删除var contactSelection
  • 在推送新的contactSelection对象
  • 之前添加委托
  • 将委托方法签名更改为:

    protocol ContactSelectionDelegate {
        func updateInvitedUsers(contactSelection:ContactSelectionViewController)
    }
    
  • 将您的委托调用更改为:

    self.delegate?.updateInvitedUsers(self)