【问题标题】:'[[myView viewWithTag:tag] removeFromSuperview]' Removes all my UIButtons'[[myView viewWithTag:tag] removeFromSuperview]' 删除我所有的 UIButtons
【发布时间】:2012-10-04 06:20:56
【问题描述】:

由于某种原因,我似乎无法在不删除所有 UIButton 的情况下删除 UIImageView。所有子视图都添加到我的主视图 _ourView 和 UIButtons 没有被赋予标签(默认 0),我的图像被赋予标签 = 5。

当我打电话时

NSInteger o = [obj intValue]; //This is the letter "O" not 0, and o = 5 in this case (which is what my subview tag is)
UIView *hangmanView = [_ourView viewWithTag:o];
[hangmanView removeFromSuperview];
[_ourView setNeedsDisplay];

我所有的按钮也消失了。

任何指针?

编辑:如果您想查看更多代码,我已将我的项目上传到 github。这是文件的链接:https://github.com/elayman/Hangman/blob/master/Hangman/HangmanViewController.m#L172

【问题讨论】:

  • 实际代码是o、zero 还是five?
  • 这个视图的标签值是多少?它不应该是零!
  • 所做的编辑 - 那是字母 o 不是 0。o=5 并且我没有使用 IB

标签: ios uiview


【解决方案1】:

您已经将按钮添加到图像视图中,或者与该标记匹配的视图是按钮的超级视图。

在调试器中检查标签值是什么(它可能不是你想的那样)以及 viewWithTag 返回的视图是什么。

无论如何,标签在大多数情况下都是无用的。为什么不使用 outlet 或 outlet 集合,它更加明确和可读。

【讨论】:

  • 也许他没有使用界面生成器...我可以理解。
  • @Bastian,如果不使用 IB,您仍然可以存储对稍后需要访问的子视图的显式引用。标签仍然是垃圾。
  • 当你使用 arc 并且可以使用自动为零的弱引用时,它们现在不太有用了......但在某些情况下,当你不想保留其他视图的子视图时,它们仍然很有用。
  • 我没有使用 IB,我在屏幕上有 26 个按钮和动态数量的图像视图 - 如果我不需要,我不想存储对所有这些的引用
【解决方案2】:

0 是标签的默认值...因此它采用没有标签的第一个视图,这可能不是您想要的。

记录您删除的内容,以便查看实际发生的情况:

NSLog(@"removing %@", hangmanView)

【讨论】:

  • 我的日志显示正确的视图被删除...很奇怪。它没有提及我的按钮。
  • 我还检查了我的按钮超级视图,它不等于 hangmanView 被删除,标签也不匹配。
【解决方案3】:

发现我在将按钮添加到超级视图后不小心释放了按钮,因此它们在 setNeedsDisplay 之后消失了。谢谢你的帮助。我只是目标 c 的新手,并认为 addSubview 消息将 subView 的控制权交给了 superView。

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多