6

Я пытаюсь обновить метку во втором VC от 1-го VC в методе prepareForSegue.iOS >> prepareForSegue >> Обновление IBOutlet не работает?

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    MYSecondViewController* secondVC = (MYSecondViewController*)segue.destinationViewController; 
    secondVC.titleLabel.text = @"First VC Says: You Are Second!!"; //This doesn't work 
    secondVC.dataPassString = @"First VC Says: You Are Second!!"; //This works + secondVC viewDidLoad 
} 

Если я обновляю ярлык напрямую, это не сработает. Если я обновляю свойство String и присваиваю его метке во втором VC viewDidLoad, он работает.

Означает ли это, что при вызове метода prepareForSegue второй метод VC viewDidLoad еще не был вызван?

Был вызван какой-то метод init (поэтому объект NSString мог пройти)? Если да, то какой?

Есть ли способ обновить IBOutlets во втором VC от 1-го VC?

ответ

2

Если вы добавите в этой строке в методе «prepareForSegue»:

if(!secondVC.titleLabel) 
    NSLog(@"titleLabel is null and it likely hasn't been loaded yet") 

Вы увидите, что вид не был загружен, пока не пришло время для того, чтобы появиться (что происходит после того, как prepareForSegue). Вот почему свойство datePassString, которое вы используете, работает, пока IBOutlets имеют значение null, пока не будет загружено представление.

8

Короткий ответ: не делайте этого.

Вы должны рассматривать другие представления диспетчера вида как частные и никогда не пытаться ими манипулировать. Это нарушает принцип инкапсуляции OOD.

Что вы хотите сделать, это добавить свойства (строки или другого типа) к контроллеру вашего целевого представления и установить THOSE в prepareForSegue. Затем в методе viewWillAppear контроллера вида назначения скопируйте эти значения свойств в представления диспетчера представлений.

В вашем случае свойство datePassString является именно тем, что вы хотите.

Таким образом, если вы измените структуру своего второго контроллера просмотра по дороге и решите отобразить информацию в другом виде, вы не нарушите связь между двумя контроллерами представления. Контроллер вашего целевого представления все еще может извлекать данные из своего источника и делать с ним что-то другое.

P.S. как сказал другой плакат, причина, по которой параметр secondVC.titleLabel.text терпит неудачу, заключается в том, что в prepareForSegue представления диспетчера вида назначения еще не загружены.

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