UIImageView alloc] initWithImage с использованием IBOutlet не работает - PullRequest
1 голос
/ 25 января 2012

Обычно я следовал шаблону создания объекта в моем методе (например, viewDidLoad), держал его свойство, а затем высвобождал созданный исходный объект. Так что-то вроде этого:

NSArray *myArray = [NSArray alloc] initWithObjects:@"1", @"2", @"3", nil];
self.array = myArray;
[myArray release];

Я думал, что смогу сделать то же самое с UIImageView. У меня UIImageView создано в моем .xib. У меня есть выход к этому, что это свойство, как так

@property (nonatomic, retain) IBOutlet UIImageView *imageView;

В моем viewDidLoad я делаю:

UIImageView *imgView = [[UIImageView alloc] initWithImage;[UIImage imageNamed:@"arrow.png"]];
self.imageView = imgView;
[imgView release];

Если я запускаю это, я ничего не вижу на экране. Однако, если я сделаю именно это в моем viewDidLoad вместо этого:

[self.imageView setImage:[UIImage imageNamed:@"arrow.png"]];

Я получаю изображение стрелки на экране. Есть ли что-то другое в UIImageView, что мне здесь не хватает?

Редактировать из-за первого ответа: UIImageView отличается от UITableView тем, что мне нужно добавить его в качестве подпредставления для моего текущего представления? Когда я создаю UITableView в IB, я не добавляю его как subview в viewDidLoad.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 25 января 2012

Вам не хватает смысла, как работает IBOutlet. Если что-то указано в .xib, то оно уже выделено для вас :) Вы просто используете это.

Следовательно, [self.imageView setImage:[UIImage imageNamed:@"arrow.png"]]; работает, поскольку вы только что присвоили ему изображение.

Однако при выполнении

UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png"]];
self.imageView = imgView;
[imgView release];

Вы фактически освободили экземпляр imageView, созданный IB в строке self.imageView = imgView;, и установили новый, и при этом вы ни к чему не добавили его как подпредставление. Так как это новый экземпляр, его нужно будет добавить !! Но в любом случае этот подход неверен, если вы используете IBOutlet

0 голосов
/ 25 января 2012

Вам необходимо добавить self.imageView в иерархию представлений.

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.imageView = ...

    // You are missing this part!
    [self.view addSubview:self.imageView];

    ...
}

PS.Вам не нужно отмечать ваше свойство UIImageView как IBOutlet, поскольку вы не используете Interface Builder для создания своего представления.

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