如何从子视图中更改UIImageView的UIImage?

时间:2010-03-22 19:21:31

标签: iphone uiview uiimageview uiimage addsubview

我想在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消息永远不会起作用。 我无法理解我做错了什么,任何帮助都非常感激!

2 个答案:

答案 0 :(得分:0)

视图的超级视图是视图,而不是视图控制器,但您将超级视图转换为类ParentViewController。如果视图没有超级视图,则返回nil,并且消息为nil是no-ops(这解释了为什么你不会在那里崩溃)。

BTW,最后[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并发布/订阅动态视图中的事件。这是两个对象之间的“最松散”耦合,但对于这种情况可能是过度的。