Изображение не устанавливается в методе

#objective-c #xcode #methods #uiimageview

#objective-c #xcode #методы #uiimageview

Вопрос:

У меня есть класс с методом viewDidLoad и методом artworkInfo следующим образом:

 -(void)viewDidLoad {
    mainDelegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];   

    [super viewDidLoad];
}

-(void)artworkInfo:(NSNumber *)pos{
    mainDelegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];   

[self.image setImage:(UIImage *)[[mainDelegate.mapAnnotations objectAtIndex:0]image]];

}
  

суть mainDelegate заключается в том, чтобы получить доступ к AppDelegate, где хранится массив, но в любом случае, с помощью команды «[self.image setImage …]» изображение в приложении не отображается, но когда я копирую именно эту строку кода в метод viewDidLoad, оно отображается так, как должно. Я знаю, что вызывается метод artworkInfo, потому что я отладил его, и он проходит, поэтому я не могу понять, почему команда не будет ничего делать с текущим методом, пока он будет в viewDidLoad …?

Кроме того, здесь вызывается метод, и это новое представление загружается из другого класса:

 infoPage *info = [[infoPage alloc] initWithNibName:@"infoPage" bundle:nil];
    info.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentModalViewController:info animated:YES];
    infoPage *myInfoPage = [[infoPage alloc] init];
    [myInfoPage artworkInfo:position];
    [info release];
  

Ответ №1:

О, я вижу проблему. Вы создаете экземпляры 2 разных infoPage классов.

Измените это:

 infoPage *info = [[infoPage alloc] initWithNibName:@"infoPage" bundle:nil];
info.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:info animated:YES];
infoPage *myInfoPage = [[infoPage alloc] init];
[myInfoPage artworkInfo:position];
[info release];
  

к этому:

 infoPage *info = [[infoPage alloc] initWithNibName:@"infoPage" bundle:nil];
info.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:info animated:YES];
[info artworkInfo:position];
[info release];
  

Комментарии:

1. Просто заметил, что, да, это, безусловно, тоже было бы проблемой

2. Вау, большое вам спасибо. Я слишком долго смотрел на это, понятия не имея, что было не так. Это всегда глупая ошибка … и @davydotcom большое спасибо за подробное объяснение, хотя на данный момент это было немного выше моего понимания 🙂

Ответ №2:

Хорошо, подробный ответ. Чтобы понять, почему это изображение не отображается должным образом, вы должны сначала посмотреть, как работают циклы выполнения в Objective C.

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

viewDidLoad вызывается перед созданием анимации для presentModalView. Это инициализирует ваши объекты. Однако из-за некоторых внутренних особенностей UI Kit некоторые процессы загружаются в поток. По завершении они запускают методы обратного вызова в главном потоке пользовательского интерфейса.

Поскольку presentModalViewController является неблокирующим методом, ваш метод artworkInfo добавляется в mainRunLoop до того, как поток формы инициализатора добавит свои методы обратного вызова в основной цикл выполнения. Наилучшим подходом было бы иметь как свойство UIImage вашего ViewController, так и UIImageView.

установите значение UIImage, вызвав artworkInfo ПЕРЕД методом presentModalViewController.

в вашем viewDidLoad продолжайте и установите значение вашего UIImageView

 [self.imageView setImage:self.image];
  

Проблема решена.

Ответ №3:

Это кажется довольно простым.

Итак, вы инициализируете свое перо и пытаетесь вызвать свой метод artwork до того, как перо будет полностью загружено. <— У вас это не работает.

Затем вы выполняете дополнительную инициализацию переопределяющим viewDidLoad для документа, в который загружается перо < — Это работает для вас

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

Я надеюсь, это немного объясняет.

Комментарии:

1. Я думаю, что это имеет смысл. Но если viewDidLoad вызывается перед оформлением (согласно отладчику), возможно ли, что перо все еще не загружено?

2. Ну, не уверен в том, как работает серверная часть, но вы можете просмотреть стек вызовов и более конкретно увидеть, что вызывается и когда. В документации упоминается следующее: «Этот метод вызывается после того, как контроллер представления загрузил связанные с ним представления в память. Этот метод вызывается независимо от того, были ли просмотры сохранены в файле nib или созданы программно в методе loadView. Этот метод чаще всего используется для выполнения дополнительных шагов инициализации в представлениях, которые загружаются из файлов nib.»

3. Хм, ну, это звучит так, как будто это должно быть сделано ко времени следующего вызова метода, поэтому я не знаю, что может происходить. Я бы просто выполнил команду в методе viewDidLoad, но я собирался заменить жестко заданный индекс массива параметром pos, поэтому я не уверен, как еще это сделать:/