UILabel, не обновляющий

Извините основной вопрос, но это прослушивает меня некоторое время теперь.

Я создаю представление деталей из UITable и пытаюсь динамично установить его маркировки, но они не обновляют:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  myObject *tmpObj = [[myObject objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

  myViewController *tmpVC = [[myViewController alloc] initWithNibName:@"NIBfile" bundle:nil];

  [tmpVC.myLabel setText:tmpObj.myTitle];   // The debugger shows the text: myTitle = "myText"
  NSLog(@"%@", tmpVC.myLabel);              // NSLog SHOWS NULL

  [self.navigationController pushViewController:tmpVC animated:YES];
  [tmpObj release];
}

соединения в Интерфейсном Разработчике установлены. Вкладка Соединений для Владельца Файла шоу

'myLabel' - 'Label (myLabel)'

какие-либо идеи, почему значение не проникает?

Еще несколько Наблюдений:

  • У меня также есть соединенный IBAction. Этот метод правильно называют, когда я нажимаю связанную кнопку.
  • Я получил несколько указателей на свой NSLog-оператор, не должно ли это лучше использовать tmpVC.myLabel.text, но пробующий также возвращает ПУСТОЙ УКАЗАТЕЛЬ.
  • myLabel объявляется как IBOutlet UILabel *myLabel в интерфейсе. Свойство определяется как неатомарное, сохранить.

СУЩЕСТВУЕТ СВЕТ:

После проигрывания вокруг с ним некоторое время больше я переместил pushViewController оператор выше обновлений маркировки. Это разрешило обновления маркировки.

Рабочий код похож на это:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 myObject *tmpObj = [[myObject objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

 myViewController *tmpVC = [[myViewController alloc] initWithNibName:@"NIBfile" bundle:nil];

 [self.navigationController pushViewController:tmpVC animated:YES];

 [tmpVC.myLabel setText:tmpObj.myTitle];   // The debugger shows the text: myTitle = "myText"
 NSLog(@"%@", tmpVC.myLabel);              // NSLog SHOWS NULL

 [tmpObj release];
}

Но я не понимаю, почему я должен продвинуть свой viewController сначала???

9
задан David Rönnqvist 24 May 2013 в 13:20
поделиться

5 ответов

Это потому, что представление контроллера лениво создается только при доступе. Нажатие на контроллер открывает доступ к представлению.

В качестве альтернативы, если вы добавите строку для доступа к свойству представления, она тоже будет работать:

  myViewController *tmpVC = [[myViewController alloc] initWithNibName:@"NIBfile" bundle:nil];
  tmpVC.view;   // Force view creation
  [tmpVC.myLabel setText:tmpObj.myTitle];   // The debugger shows the text: myTitle = "myText"
  NSLog(@"%@", tmpVC.myLabel);              // NSLog will display "myText"
  [self.navigationController pushViewController:tmpVC animated:YES];
13
ответ дан 4 December 2019 в 13:46
поделиться

Не потому ли, что ваш NSLog пытается распечатать фактический объект этикетки. Если у вас нет

NSLog(@"%@", tmpVC.myLabel.text);

В ответ на добавленную информацию: Другая ваша проблема может заключаться в том, что вы связали NSString со своим лейблом. Вы должны связать его с UILabel . Итак, когда вы объявляете свой myLabel var, измените его на UILabel * myLabel и то же самое для любого подходящего свойства.

0
ответ дан 4 December 2019 в 13:46
поделиться

Не уверен, но я думаю, что это то, что происходит:

Когда представление выдвигается, контроллер загружает представление из пера и подключает действия и выходы . До этого розетки не подключены, поэтому tmpVC.myLabel равен нулю.

Если вы хотите быть уверенным, вы можете поместить точку останова в viewDidLoad tmpVC, чтобы видеть, когда представление загружено.

0
ответ дан 4 December 2019 в 13:46
поделиться

Если tmpVC.myLabel является NULL, это, вероятно, указывает на то, что вы не установили необходимую связь в Interface Builder с UILabel и переменной экземпляра myLabel.

1
ответ дан 4 December 2019 в 13:46
поделиться

Вы @synthesize свое свойство myLabel в myViewController.m ? У вас должно получиться что-то вроде:

tmpVC.myLabel.text = tmpObj.myTitle;

1
ответ дан 4 December 2019 в 13:46
поделиться