#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, поэтому я не уверен, как еще это сделать:/