【问题标题】:How to change the UIImage of a UIImageView from a subview?如何从子视图更改 UIImageView 的 UIImage?
【发布时间】:2010-03-22 19:21:30
【问题描述】:

我想从 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 消息永远不会起作用。 我不明白我做错了什么,非常感谢任何帮助!

【问题讨论】:

    标签: iphone uiview uiimageview uiimage addsubview


    【解决方案1】:

    你有几个选择...

    第一个是在您的 IconsViewController 上创建一个 ParentViewController* 类型的属性,例如:

    @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 并从您的动态视图发布/订阅事件。这是两个对象之间“最松散”的耦合,但在这种情况下可能有点过头了。

    【讨论】:

    • 感谢您的帮助。我必须阅读更多关于代表和协议的内容。我也没有得到的一件事是,为什么要创建 parentController 属性(读写、非原子、分配)。有什么快速的见解吗?
    • 见上文,我用更多关于属性定义的信息更新了描述
    【解决方案2】:

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

    顺便说一句,最后的[self release] 非常可疑。

    【讨论】:

    • 非常感谢您 - 我会将另一个答案标记为已接受,但您帮助我了解了我的错误。我知道这个 [self release] 不好,但我还不确定在哪里发布它 - 这是接下来要检查的事情。再次感谢!
    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多