UILabel, UITextView и т. Д. Работают только в ViewWillAppear и ViewDidLoad и не изменяются динамически - PullRequest
0 голосов
/ 19 марта 2012

У меня есть проблема, я хочу установить текст UILabel или UItextView или других объектов IBOUTLET, но я могу сделать это только в методах viewwillappear и viewdidload, если я установил текст в другом методе в коде, ничего не изменилось Вот пример:

У меня есть метод, который извлекает строку из другого класса, а затем я хочу установить эту строку в моем uilabel:

- (void)setDetailItem:(id)newDetailItem
{

if (detailItem != newDetailItem) {
    NSLog(@"SetDetailItem");
    [detailItem release]; 
    detailItem = [newDetailItem retain]; 
    detailString = [[FindStringClass alloc] init];
    // Update the view.

    detailItem = [detailString searchStringFor:detailItem.name];

    if (detailItem) {
        //
        NSLog(@"setDetail: %@",detailItem.stringName);
        [self configureView];
    }

  }
 }

  - (void)configureView {

NSLog(@"configure view: %@",detailItem.stringName);
mySerialTitle.text = detailItem.stringName;
}

NSLog работает, и я могу видеть мою строку в консоли, но текст в представлении не изменяется, вместо этого, если я устанавливаю простой текст в методе ViewWillAppear или viewDidLoad, таким образом, соединение с IBOOutlets является правильным , вот так:

- (void)viewDidLoad
{
mySerialTitle.text = @"CIAO";
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}

Это функция вызова, в которой я вызываю setDeatItem из другого представления:

  self.searchResultViewController.detailItem =    [myArray objectAtIndex:[indexPath row]];    
  [self.navigationController pushViewController:self.searchResultViewController animated:YES];

Кто-нибудь может мне помочь?

EDIT: Это NSLog, где метод вызывается:

2012-03-19 12:51:02.617 TestApp[292:b603] SetDetailItem
2012-03-19 12:51:06.161 TestApp[292:b603] setDetail: Chicken
2012-03-19 12:51:06.162 TestApp[292:b603] configure view: Chicken
2012-03-19 12:51:06.175 TestApp[292:b603] View DidLoad

Я вызываю представление searchviewcontroller из Tableviewcontroller. Я нажимаю на строку, а затем вызываю новое представление и передаю атрибут.

Ответы [ 2 ]

0 голосов
/ 19 марта 2012
- (void)setDetailItem:(id)newDetailItem
{

if (detailItem != newDetailItem) {
    NSLog(@"SetDetailItem");
    [detailItem release]; 
    detailItem = [newDetailItem retain]; 
    detailString = [[FindStringClass alloc] init];
    // Update the view.

    detailItem = [detailString searchStringFor:detailItem.name];

    if (detailItem) {
        //
        NSLog(@"setDetail: %@",detailItem.stringName);
        [self configureView];
    }

  }
 }

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

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

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

0 голосов
/ 19 марта 2012

viewDidLoad вызывается после загрузки представления в память.См. viewDidLoad в документах Apple.После того, как представление загружено в память и прямо перед его появлением, вызывается viewWillAppear.

Вы не можете изменить свойства представления до его загрузки.Итак, проверьте пути вашего кода (и, возможно, даже выйдите из этих методов и методов viewDidLoad и viewWillAppear) и посмотрите, устанавливаете ли вы эти свойства перед вызовом viewDidLoad (вывод в журнал облегчит просмотр).

Из документов viewDidLoad:

Этот метод вызывается после того, как контроллер представления загрузил свою иерархию представления в память.Этот метод вызывается независимо от того, была ли иерархия представления загружена из файла пера или создана программно в методе loadView.Обычно вы переопределяете этот метод, чтобы выполнить дополнительную инициализацию для представлений, которые были загружены из nib-файлов.

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

2012-03-19 12:51:02.617 TestApp[292:b603] SetDetailItem
2012-03-19 12:51:06.161 TestApp[292:b603] setDetail: Chicken
2012-03-19 12:51:06.162 TestApp[292:b603] configure view: Chicken
2012-03-19 12:51:06.175 TestApp[292:b603] View DidLoad

Если вы хотите установить данные для представления, которое вы нажимаете, у вас есть пара опций.

  1. Вызовите setDetail, но в setDetail только установите данные iVar - не манипулируйте представлениями.Затем в viewDidLoad / WillAppear прочитайте данные iVar и манипулируйте представлениями.

  2. Используйте делегатов, чтобы представление, которое вы толкаете, возвращалось к представлению запуска.См. Что именно делает делегат в проекте xcode ios?

...