Вопрос

Я хочу изменить изображение в представлении из всплывающего диалогового окна, состоящего из 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 никогда не работает.Я не могу понять, что я делаю не так, любая помощь очень ценится!

Это было полезно?

Решение

Здесь у вас есть несколько вариантов...

Сначала создайте свойство на вашем 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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top