2010-03-22 2 views
0

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

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

ответ

0

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

Первый из них создать свойство на вашем 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 

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

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

+0

Спасибо, что помогли. Я должен больше узнать о делегатах и ​​протоколах. Одна вещь, которую я тоже не понимаю, - это то, почему вы создаете свойство parentController (readwrite, nonatomic, assign). Любое быстрое понимание? – phi

+0

см. Выше, я обновил описание с дополнительной информацией об определениях свойств – slf

0

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

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

+0

Большое вам спасибо за это. Я отвечу на другой ответ как принятый, но вы помогли мне понять мои ошибки. Я знаю, что этот [самостоятельный выпуск] не очень хорош, но я не уверен, где его еще выпускать - вот что нужно проверить, хотя .. Еще раз спасибо! – phi

Смежные вопросы