2015-01-14 2 views
0

Я вытаскиваю свои волосы, пытаясь заставить эту делегацию работать в Swift для приложения, над которым я работаю.Использование делегата для передачи var

У меня есть два файла: CreateEvent.swift и ContactSelection.swift, где первый звонит последнему.

CreateEvent 'содержание s являются:

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' s содержание:

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.

ответ

2
var contactSelection: ContactSelectionViewController = ContactSelectionViewController() 

Это экземпляр контроллера представления напрямую, и значение никогда не используется. Поскольку похоже, что вы используете раскадровки, это не очень хорошая идея, так как ни одна из точек не будет подключена, и вы получите дополнительные отказоустойчивые сбои. Вы устанавливаете делегата этого контроллера вида, но это не имеет значения, поскольку оно не используется.

Это также не очень хорошая идея, потому что если вы выполняете несколько нажатий, вы будете повторно использовать один и тот же контроллер представления, и это в конечном итоге приведет к ошибкам, так как вы будете иметь оставшееся состояние из предыдущих применений, что может дать неожиданные результаты , Лучше каждый раз создавать новый контроллер просмотра.

В вашем коде вы создаете совершенно новый contactSelection из раскадровки и нажимаете его, не устанавливая делегата.

Вам необходимо установить делегат на экземпляр, который вы нажимаете на стек навигации.

Также полезно передать ссылку в методе делегата, которая может использоваться для извлечения значений, вместо того, чтобы полагаться на отдельную ссылку в var, как вы это делаете.

Итак, я хотел бы сделать следующее:

  • Снимите var contactSelection
  • Добавить делегат перед отправкой нового contactSelection объекта
  • Изменить метод делегата подписи к этому:

    protocol ContactSelectionDelegate { 
        func updateInvitedUsers(contactSelection:ContactSelectionViewController) 
    } 
    
  • Измените свои делегированные вызовы на это:

    self.delegate?.updateInvitedUsers(self) 
    
+0

Я исправил это предложением. Я добавил в то, что я сделал с моим кодом выше, но я хотел бы изменить его больше. Если я прокомментирую 'let contactSelection = self.Story .....' и использую определенный 'var contactSelection', объявленный ранее, он сбрасывается при нажатии на представление. – rusty

+0

Это, вероятно, потому, что вы не можете просто создать экземпляр контроллера представления без использования раскадровки, так как ни один из точек не будет существовать. Вам лучше делать и нажимать новый каждый раз, а также передавать ссылку в качестве части методов делегата. Я отредактирую ответ – jrturton

+0

Спасибо, что вернулись ко мне.Я отмечаю вас как ответ, потому что я решил свою проблему, я еще не пробовал новое редактирование, так как я работаю над другой частью моего проекта, но когда-нибудь снова будет стабильным - я тоже отчитаюсь чтобы убедиться, что это работает :) Спасибо! – rusty

Смежные вопросы