我想在4-6个图标的弹出式对话框中更改视图上的图像(想象一下在Messenger应用程序中更改图像)。 我实现这个模态弹出窗口的方法是在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消息永远不会起作用。
我无法理解我做错了什么,任何帮助都非常感激!
答案 0 :(得分:0)
视图的超级视图是视图,而不是视图控制器,但您将超级视图转换为类ParentViewController
。如果视图没有超级视图,则返回nil
,并且消息为nil是no-ops(这解释了为什么你不会在那里崩溃)。
[self release]
非常可疑。
答案 1 :(得分:0)
你在这里有几个选择......
首先是在ParentViewController*
类型的IconsViewController上创建一个属性,例如:
@property (readwrite,nonatomic,assign) ParentViewController* parentController; // weak reference
进一步打破这个:
readwrite
因为我们希望能够通过[self parentController]
访问该值,但也可以通过[iconsViewController setParentController:self]
更改nonatomic
因为我不太担心线程assign
使其成为“弱参照”,其中父母不会保留父母。如果它们彼此retain
,则可能导致内存泄漏,因为除非明确释放,否则最终会出现保留圆圈,导致任何对象都没有达到零保留计数。从nib加载时,设置属性:
IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
iconsViewController.parentController = self;
然后,从iconIsSelected
内部调用它,如下所示:
[[self parentController] changeIcon];
或者,您可以创建委托协议:
@protocol IconViewSelectedDelegate (NSObject)
- (void) changeIcon;
@end
并将该协议用作属性,而不是父视图控制器类型。这更抽象,但它使设计更清洁。然后,父视图控制器将实现该委托协议,作为许多其他协议之一。
另一种选择是使用NSNotificationCenter并发布/订阅动态视图中的事件。这是两个对象之间的“最松散”耦合,但对于这种情况可能是过度的。