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

Posted

技术标签:

【中文标题】如何从子视图更改 UIImageView 的 UIImage?【英文标题】:How to change the UIImage of a UIImageView from a subview? 【发布时间】: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 消息永远不会起作用。 我不明白我做错了什么,非常感谢任何帮助!

【问题讨论】:

【参考方案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] 不好,但我还不确定在哪里发布它 - 这是接下来要检查的事情。再次感谢!

以上是关于如何从子视图更改 UIImageView 的 UIImage?的主要内容,如果未能解决你的问题,请参考以下文章

将图像从子视图绘制到父视图

从子视图 SwiftUI 中删除 UI 元素

SwiftUI:从子视图中关闭模式

如何将数据从子视图传递到父视图到 SwiftUI 中的另一个子视图?

使用 @State 变量不适用于从子视图更改 Body 中的视图状态

从子视图中更改视图中的数组“不能在不可变值上使用变异成员:'self' 是不可变的”