prepareForSegue:sender: не удается изменить свойство в целевом виртуальном канале

Я не уверен, что я делаю неправильно. У меня есть два режима - редактировать и добавлять. При нажатии кнопки добавления из VC1 происходит переход к VC2, и пользователь может заполнить данные и добавить запись в таблицу VC1. Это работает. Однако у меня есть некоторая ProblamaticUILabel в VC2, которую я хочу отобразить «Режим добавления». Я пытаюсь установить его в segue, но это не работает.

Если затем пользователь коснется ячейки таблицы, которую он создал в VC1, я хочу, чтобы использовался тот же VC2, но я хочу изменить someProblamaticUILabel на «Режим редактирования». Это не работает.

Я подключил их с помощью раскадровки.

Ниже приведены некоторые варианты вывода

  From Segue of VC1
     segue.destinationViewController: AppVC2: <AppVC2: 0x146b5f40>
     AppVC2.someProblamaticUILabel: (null)
     AppVC2.someProblamaticUILabel.text: (null)
  From viewDidLoad of VC2: <AppVC2: 0x146b5f40>
     AppVC2 someFunctionalAttribute: edit
     AppVC2 someProblamaticUILabel: <UILabel: 0x1454efc0; frame = (16 20; 151 54); text = 'Add/Edit'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x1454ef50>>
     AppVC2 someProblamaticUILabel.text: Add/Edit

Некоторый код

//VC1

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue.identifier isEqualToString:@"AddHomePlayerSegue" ]){
        AppVC2 * addHome = (AppVC2 *) segue.destinationViewController;
        [addHome setDelegate:self];
        addHome.teamType = HOME_TEAM;
        addHome.mode = ADD_MODE;
        addHome.someProblamaticUILabel.text = @"Add";

    }else if([segue.identifier isEqualToString:@"EditVisitorPlayerSegue" ]){
        AppVC2 * editVisitor = (AppVC2 *) segue.destinationViewController;
        [editVisitor setDelegate:self];
        editVisitor.mode = EDIT_MODE;
        editVisitor.someProblamaticUILabel.text = @"Edit";

        NSLog(@"\n  From Segue of VC1");
        NSLog(@"\n     segue.destinationViewController: AppVC2: %@", editVisitor);
        NSLog(@"\n     AppVC2.someProblamaticUILabel: %@", editVisitor.someProblamaticUILabel);
        NSLog(@"\n     AppVC2.someProblamaticUILabel.text: %@", editVisitor.someProblamaticUILabel.text);
    }
}

// VC2

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"\n  From viewDidLoad of VC2: %@", self);
    NSLog(@"\n     AppVC2 someFunctionalAttribute: %@", self.mode);
    NSLog(@"\n     AppVC2 someProblamaticUILabel: %@", self.someProblamaticUILabel);
    NSLog(@"\n     AppVC2 someProblamaticUILabel.text: %@", self.someProblamaticUILabel.text);
}

Еще один вопрос. Как лучше всего сообщить VC2, что пользователь коснулся x строки с данными y, которые нужно заполнить из VC1 в VC2?


person quijote    schedule 06.01.2015    source источник
comment
я думаю, что метки не инициализированы в этот момент, вы можете установить свойство в целевом vc, а затем в его viewDidLoad установить текст uilabels на значение свойства   -  person Fonix    schedule 06.01.2015


Ответы (2)


Ваша проблема, вероятно, связана с тем, что когда вы пытаетесь установить свойство text в своем UILabel, оно еще не было инициировано. Метод prepareForSegue: вызывается перед переходом, то есть до того, как что-либо будет загружено из вашей раскадровки, и до вызова viewDidLoad в вашем VC2.

Попробуй это :

• Удалите две строки addHome.someProblamaticUILabel.text = @"....."; из метода prepareForSegue:.

• В VC2 в методе viewDidLoad проверьте self.mode и установите метку в соответствии с этим значением:

-(void)viewDidLoad {
    [super viewDidLoad];

    if ([self.mode isEqualToString:ADD_MODE]) self.someProblamaticUILabel.text = @"Add";
    else if ([self.mode isEqualToString:EDIT_MODE]) self.someProblamaticUILabel.text = @"Edit";
    else self.someProblamaticUILabel.text = @"Unknown";
}
person rdurand    schedule 06.01.2015

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

Во-первых, будет

[self performSegueWithIdentifier:@"SEGUE_IDENTIFIER"];

Во-вторых, будет вызван viewDidLoad вашего целевого контроллера представления.

В-третьих, будет вызван prepareForSegue в вашем первом контроллере представления.

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

Надеюсь это поможет..

person Henit Nathwani    schedule 06.01.2015