如何从子视图更改 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 中的另一个子视图?