Как пройти иерархию классов через назначение переменных в Cocoa Touch? - PullRequest
1 голос
/ 24 апреля 2009

Я создал класс UIViewController под названием MyViewController с UIImageView в его XIB-файле. Затем я импортирую этот класс в другой класс. Я делаю экземпляр класса и меняю изображение в UIImageView, используя код:

myViewController.myImageView.image = [UIImage imageNamed:@"myImage.png"];

Это работает плавно. Мое приложение по сути является средством просмотра изображений. Я хотел кэшировать следующее и предыдущее изображения, предварительно загрузив подпредставление с изображением. Когда я помещаю myViewController в переменную, как это:

UIViewController *pager = myViewController;

И попытайтесь использовать переменную, чтобы установить изображение для UIImageView следующим образом:

pager.myImageView.image = [UIImage imageNamed:@"myImage.png"];

Я получаю "ошибку: запрос на член 'myImageView' во что-то, не являющееся структурой или объединением". Я пытался сделать это, используя квадратные скобки:

[[[pager myImageView] setImage:[UIImage imageNamed:@"myImage.png"]];

Я получаю "предупреждение" UIViewController 'может не отвечать на' -myImageView '". Как мне получить доступ к иерархии, чтобы добраться до myImageView? Я использовал @class в заголовке и #import, и я синтезировал экземпляр класса. Единственное решение, которое у меня есть, это взлом, сделав это:

UIImageView *pager = myViewController.myImageView;
pager.image = [UIImage imageNamed:@"myImage.png"];

Что удваивает количество переменных, которые у меня есть, одна для переменной UIImageView, а другая для переменной UIViewController. Заранее спасибо всем, кто может помочь.

1 Ответ

1 голос
/ 24 апреля 2009

быстрый ответ :

Вам нужно изменить строку:

UIViewController *pager = myViewController;

до:

MyViewController *pager = myViewController;

Чтобы иметь доступ к пользовательским свойствам, которые вы добавили в свой класс MyViewController.

Объяснение

Ваш MyViewController класс, вероятно, выглядит примерно так (упрощенно):

// MyViewController.h:
@interface MyViewController : UIViewController
{
    UIImageView * myImageView;
}
@property (readonly) UIImageView * myImageView;
@end

// MyViewController.m:
@implementation MyViewController
@synthesize myImageView;
@end

У вас есть расширенный класс UIViewController путем добавления переменной-члена и свойства (myImageView) к исходному классу.

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

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