Нажатие на View Controller - viewDidAppear не вызывается - PullRequest
2 голосов
/ 07 ноября 2011

У меня есть этот кусок кода, чтобы подтолкнуть контроллер представления:

        // Setup the animation
[self.navigationController pushViewController:self.productView animated:YES];

self.productView.imageURL = [product imageURL];

// Set the title of the view to the product's name
self.productView.title = [product name];

// Set the label text of all the labels in the view
[self.productView.caloriesL setText:[product calories]];
[self.productView.fatL setText:[product fat]];
[self.productView.saturatesL setText:[product saturates]];
[self.productView.sugarL setText:[product sugar]];
[self.productView.fibreL setText:[product fibre]];
[self.productView.saltL setText:[product salt]];

Но метод делегата viewDidAppear не вызывается при появлении productView. Я посмотрел на проблему в Google, и там было много разных решений, ни одно из которых я не мог применить к своей проблеме. У меня была похожая проблема в предыдущем решении, но я обошел ее вручную, вызвав viewDidApear в методе viewDidLoad. К сожалению, в этом случае я не могу этого сделать, так как viewDidLoad вызывается только один раз (при первом нажатии). Кто-нибудь знает как это исправить?

Спасибо

Джек Наткинс

EDIT:

Вот метод viewDidAppear в productView (и селектор):

- (void)viewDidAppear:(BOOL)animated{
//Start animating the activity indicator
[indicator startAnimating];
//Perform this method in background
[self performSelectorInBackground:@selector(loadImage) withObject:nil];

}

- (void) loadImage {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Load the animals image into a NSData boject and then assign it to the UIImageView
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]];
    UIImage *image = [[UIImage alloc] initWithData:imageData];
    self.imageView.image = image;

    //Stop animating the activity indicator
    [indicator stopAnimating];

    [pool drain]; //see comment below
}

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

Первый: Вы определенно не хотите вызывать какие-либо стандартные методы viewWillLoad, viewDidLoad, viewWillAppear и т. Д. Вручную. Пусть ОС сделает это за вас.

Секунда: Можете ли вы показать нам, как ваш viewDidAppear метод реализован в вашем self.productView экземпляре? (Просто догадка, вы не ожидаете, что этот метод будет вызван на вашем контроллере навигации, не так ли?) Я просто хочу убедиться, что подпись вашего метода точно верна. Если это не так (из-за неправильного написания, неправильных аргументов и т. Д.), То он точно не будет вызван.

В-третьих: Я бы переместил ваш pushViewController: вызов после оставшегося вами кода. Вы не хотите, чтобы представление отображалось на экране (чтобы пользователь мог его видеть), и , тогда имеют сразу несколько значений на экране, которые немедленно изменяются. Сначала установите ваши свойства ivars и title, затем нажмите контроллер представления. Это устраняет любые странные мерцания.

0 голосов
/ 08 ноября 2011

Я решил, хотя это не кажется обычным, не могу поверить, что я не пробовал раньше:

Я поставил эту строку:

[self.productView viewDidAppear:YES];

Под:

    // Setup the animation
[self.navigationController pushViewController:self.productView animated:YES];

Я также переместил код, чтобы установить текст меток для запуска перед строкой выше. (Как и изменение моего кода для отправки строк в отправляемый контроллер вместо доступа к его элементам пользовательского интерфейса.)

Спасибо за помощь всем,

Jack

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...