2013-03-07 2 views
0

Каков наилучший способ настройки «подробного» ViewController? Скажем, у меня очень простой DetailViewController с UILabel. Он имеет API (это псевдо-код для demostrate концепции):iOS Инициализация контроллера View View

UpdateLabel(string text) 
{ 
    this.label.text=text; 
} 

Так в родительском ViewController, у меня есть:

PrepareForSegue(UIStoryboardSegue segue, NSObject sender) 
{ 
    base.PrepareForSegue(segue, sender); 
    DetaiViewController.UpdateLabel("Hello"); 
} 

Однако это выходит из строя, потому что «метка» является недействительным в Подробно Просмотрите контроллер, потому что ViewDidLoad еще не вызван. Я знаю, что это можно исправить, добавив что-то в это обновление в UpdateLabel

UpdateLabel(string text) 
{ 
    this.View.Hidden=this.View.Hidden; // To force view to load 
    this.label.text=text; 
} 

но это кажется очень хриплым.

С другой стороны, я мог бы изменить UpdateLabel просто хранить строку:

UpdateLabel(string text) 
{ 
    this.textString.text=text; 
} 

, а затем инициализирует метку в ViewDidLoad:

public override void ViewDidLoad() 
{ 
    base.ViewDidLoad(); 
    this.label.text=this.textString; 
} 

Но что, если я хочу, чтобы родительский контроллер modifiy метку позже? Вызов UpdateLabel будет только обновлять переменную textString и не менять метку.

Каков правильный подход для этого?

ответ

0
  1. Вы init в UIViewController и передать текст, сохранить его, и на viewDidLoad обновлении UILabel.
  2. Затем вы можете обновить UILabel, предоставив его другим классам (например, как свойство).
+0

Спасибо за быстрый ответ, но это не звучит как очень хороший API. Фактически у нас были бы InitLabel и UpdateLabel, и до сих пор неясно, когда можно безопасно позвонить в UpdateLabel, например, InitLabel, за которым немедленно следует UpdateLabel, по-прежнему будет аварийно завершена. – Bbx

+0

Хорошо, используя этот шаблон в течение некоторого времени, и у меня нет никаких проблем с ним. В 'viewDidLoad' вы можете вызвать метод, который вы используете для обновления' UILabel'. – Peres

0

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

Если подробный вид отображается не по результату segue, например, когда вы используете панель вкладок, например, и viewDidLoad не вызывается, вы можете сделать родительский контроллер делегатом контроллера подробного представления и на viewWillAppear вы вызываете метод делегата для обновления контроллера подробного представления. После этого контроллер подробного представления обновляет свои представления/подпрограммы.

Таким образом вы даете возможность родительскому контроллеру внести изменения.

Не знаю, если это лучший вариант для вас ...

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

  • Нет связанных вопросов^_^