Как изменить UIImage UIImageView из подпредставления? - PullRequest
0 голосов
/ 22 марта 2010

Я хочу изменить изображение на виде из всплывающего диалогового окна из 4-6 значков (представьте, что вы меняете изображение в приложении для обмена сообщениями).Я реализую это модальное всплывающее окно путем создания нового представления в IB с непрозрачностью на фоне, а затем загружаю его как подпредставление:

    IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
[self.view addSubview:iconsViewController.view];

Итак, когда пользователь касается значка,иметь

- (IBAction)iconIsSelected:(id)sender {
switch ([sender tag]) {
    case 1:
        [(ParentViewController*)[self superview] changeIcon];
        break;
    case 2:
        // same here..
        break;
    default:
        break;
}
[self.view removeFromSuperview];
[self release];

}

changeIcon просто устанавливает image на соответствующий значок.Как вы можете догадаться, это не работает - сообщение changeIcon никогда не работает.Я не могу понять, что я делаю не так, любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 22 марта 2010

У вас есть несколько вариантов здесь ...

Сначала создайте свойство на вашем IconsViewController типа ParentViewController*, например:

@property (readwrite,nonatomic,assign) ParentViewController* parentController; // weak reference

Чтобы разбить это дальше:

  • readwrite, потому что мы хотим иметь возможность доступа к значению через [self parentController], а также изменить его через [iconsViewController setParentController:self]
  • nonatomic потому что я не слишком беспокоюсь о потоке
  • assign, чтобы сделать его "слабой ссылкой", когда родитель не будет удерживаться ребенком. Если каждый из них retain другой, это может привести к утечкам памяти позже, потому что, если явно не освободить, вы получите круг сохранения, в результате чего ни один объект не достигнет нулевого счетчика сохранения.

При загрузке с пера установите свойство:

IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
iconsViewController.parentController = self;

Затем вызовите его изнутри iconIsSelected так:

[[self parentController] changeIcon];

В качестве альтернативы вы можете создать протокол делегата:

@protocol IconViewSelectedDelegate (NSObject)

- (void) changeIcon;

@end

И используйте этот протокол в качестве свойства вместо родительского типа контроллера представления. Это более абстрактно, но сохраняет дизайн чище. Затем родительский контроллер представления будет реализовывать этот протокол делегата, как один из многих других.

Другой вариант - использовать NSNotificationCenter и публиковать / подписываться на события из вашего динамического представления. Это самая «слабая» связь между двумя объектами, но она может быть излишней для этого сценария.

0 голосов
/ 22 марта 2010

Суперпредставление представления - это представление, а не контроллер представления, но вы присваиваете суперпредставление класса ParentViewController. Если представление не имеет суперпредставления, оно возвращает nil, и сообщение для nil - это no-ops (что объясняет, почему вы там не зависаете).

Кстати, это [self release] в конце очень подозрительно.

...