UIScrollview内的UIView内的UIButton,ARC问题
Posted
技术标签:
【中文标题】UIScrollview内的UIView内的UIButton,ARC问题【英文标题】:UIButton inside UIView inside UIScrollview, ARC issue 【发布时间】:2011-11-10 02:18:27 【问题描述】:这是一个 ios5 和 ARC 特定的问题。
我在 UIScrollView 中设置了一组 UIView,每个 UIView 都在 UIView 类中声明了自己的 UIButton:
IBOutlet UIButton*button;
@property(nonatomic,strong) UIButton*button;
(我也原来有这个作为保留而不是强,但它没有区别)
我还合成了按钮并在 IB 中将其连接到:
-(IBAction)showArticle:(id)sender;
我将它们全部添加到带有大循环的滚动视图中,具体取决于文章的类型:
NewsScrollLead*view = [[NewsScrollLead alloc]initWithNibName:@"NewsScrollLead" bundle:nil];
[view.view setFrame:CGRectMake(0, 0, 513, 225)];
[view.titleLabel setText:[newsDict objectForKey:@"title"]];
[view.details setText:[self flattenhtml:[newsDict objectForKey:@"description"]]];
[view.source setText:[newsDict objectForKey:@"author"]];
[view.details setFont:[UIFont fontWithName:@"HelveticaNeue-Condensed" size:14]];
[view.titleLabel setFont:[UIFont fontWithName:@"HelveticaNeue-BoldCond" size:20]];
[view.source setFont:[UIFont fontWithName:@"HelveticaNeue-Condensed" size:14]];
[self.newsScrollView addSubview:view.view];
这是一个如何创建视图并将其添加到滚动视图的示例。
当我尝试点击一个按钮时,我每次都会收到一个无法识别的选择器错误,而不是 UIButton。使用 NSZombie,按钮已因某种原因被释放。
有什么想法吗?相同类型的 Pre-iOS5 问题已通过保留 UIButton 或包含它的视图来解决,但在 ARC 中没有可用的保留。
【问题讨论】:
我发现的一个临时解决方法是像这样以编程方式添加按钮:UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, view.view.frame.size.width, view.view.frame.size.height)];
[button setTag:i];
[button addTarget:self action:@selector(presentArticle:) forControlEvents:UIControlEventTouchUpInside];
[view.view addSubview:button];
[view setButton:button];
这解决了这个问题,按钮永远不会释放' d,但不是问题的真实答案。
你确定是被释放的按钮吗?这真的没有意义。在我看来,您的 NewsScrollLead 视图控制器(按钮的目标?)可能在您显示的内容中被释放。错误中无法识别的选择器是什么?什么是 UIView 子类(NewsScrollLead 看起来像 UIViewController 子类)?
在我看来,您创建的 NewsScrollLead*view 没有被保留在任何地方,因此这可能是正在发布的内容。向您的类添加一个数组并将它们添加到数组中,以便您维护它们的句柄并查看是否可以解决问题。
【参考方案1】:
您有以下内容: - 一个名为 view 的 NewsScrollLead 对象(我们称它为 N) - 在 N 内部有一个视图(我们称之为 V) - 在 N 里面还有一个 UIButton B - 然后你添加到 self.newsScrollView 视图 V
N怎么了?好吧,它被释放了,因为它从未被使用过。因此 B 也被释放。唯一剩下的就是 V。
您的问题是您创建了无用的 V。留在 N 并将其添加到 self.newsScrollView。为什么在 N 中需要一个 V?或者,如果你确实需要 N 来存储各种项目,那么 N 应该是一个 NSObject(而不是 NSView),并且 self 应该有一个数组属性来存储你创建的所有 N 个对象。
【讨论】:
以上是关于UIScrollview内的UIView内的UIButton,ARC问题的主要内容,如果未能解决你的问题,请参考以下文章
iOS - UITableViewCell 内的 UIScrollView 内的 UIView 未触发 UITapGestureRecognizer
在 UIScrollView 内的 UIView 上绘制草图
UIScrollView 内的 UIView 没有收到触摸事件