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 上绘制草图

UIScrollView 内的 UIView 没有收到触摸事件

UIScrollView 内的 UIView 上的 UIButton

UIScrollView 用于主 UIView 内的较小 UIView