2016-02-29 2 views
0

Это сводит меня с ума. Функция updateTextView() вызывается, проверяется операторами печати, но она не устанавливает метку в моем контроллере представления, а операторы печати для метки возвращают нуль, даже если она имеет значение по умолчанию, которое отображается, когда приложение загружен. Больше всего смущает то, что я установил тестовую кнопку для вызова этой функции по отдельности, и когда я вызываю ее с помощью test(), метка обновляется правильно.Swift Text Label Nil Даже со значением по умолчанию

class GoalDetailViewController: UIViewController, TextDelegate { 

    @IBAction func test(sender: AnyObject) { 
     updateTextView() 
    } 

    func updateTextView() { 
     print(goalSummaryTextBox?.text) 
     print("delegate called") 
     self.goalSummaryTextBox?.text = GoalsData.summaryText 
     print(goalSummaryTextBox?.text) 
    } 

    @IBOutlet weak var goalTitle: UILabel? 
    @IBOutlet weak var goalCreationDate: UILabel? 
    @IBOutlet weak var goalSummaryTextBox: UITextView? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     goalSummaryTextBox?.text = GoalsData.summaryText 
    } 
} 

updateTextView() вызывается через метод делегата после того, как я поп другой контроллер представления, как можно увидеть ниже:

class TextEditViewController: UIViewController { 
    var textDelegate: TextDelegate? 

    @IBOutlet weak var textView: UITextView? 

    func configureView() { 
     navigationItem.title = "Edit Description" 
     navigationItem.setRightBarButtonItem((UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: "segue")), animated: true) 
    } 

    func segue() { 
     textDelegate = GoalDetailViewController() 

     if let text = textView?.text {  
      GoalsData.summaryText = text 
     } 

     textDelegate?.updateTextView()   
     self.navigationController?.popViewControllerAnimated(true) 
    } 
} 
+1

Это последнее предложение может быть проблема. – tktsubota

+0

Можете ли вы уточнить? Я знаю, что он вызывает функцию из-за операторов печати. –

+0

Можете ли вы опубликовать код, относящийся к разному контроллеру вида, который вылезает (и вызывает вызов 'updateTextView()')? Возможно, что 'updateTextView()' вызывается в фоновом порядке. Можете ли вы также добавить 'print (GoalsData.summaryText)' to 'updateTextView()' только для того, чтобы убедиться, что это действительно другое? – Mark

ответ

0

Линия вызывает проблема заключается в приведенной ниже TextEditViewController:

textDelegate = GoalDetailViewController() 

Что делает эта строка, создает новый экземпляр GoalDetailViewController и устанавливает его как делегата на TextEditViewController , Но вы хотите, чтобы исходный экземпляр GoalDetailViewController был делегатом. Вот почему вы видели журналы при появлении TextEditViewController, так как он выполнял другой экземпляр (который не был частью иерархии представлений). Это также объясняет, почему все ваши IBOutlet s равны нулю при переходе через updateTextView() на вызов делегата и что кнопка, которую вы добавили, правильно обновляет текст.

Решение сделать соединение делегат в методе prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let destination = segue.destinationViewController as? TextEditViewController { 
     destination.textDelegate = self 
    } 
} 

Добавить код выше в ваш GoalDetailViewController.

EDIT:

Код ниже будет гарантировать, что эта проблема не произойдет в будущем. Изменить определение делегата для:

weak var textDelegate: TextDelegate? 

и изменить свой протокол:

protocol TextDelegate: class { 
    func updateTextView() 
} 
+0

спасибо. на стороне записки, это то, с чем я боролся: общение с конкретным экземпляром viewcontroller. готовоСоздать единственный способ поговорить с конкретным экземпляром? и большое спасибо, что это отлично работает –

+0

При использовании раскадровки это один из самых простых способов связать два контроллера представления вместе. – Mark

+0

Если это решило вашу проблему, отметьте ее как правильную. – Mark

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