【问题标题】:Error on self.view.viewWithTag() on iOS 8.3iOS 8.3 上的 self.view.viewWithTag() 错误
【发布时间】:2015-11-16 23:23:57
【问题描述】:

我正在尝试删除我之前添加到 UIViewController 上的视图中的视图。该代码在 iOS 9 上运行,但在模拟器中的 8.3 上崩溃。

我在添加之前为视图分配了 100 的标签。

出于调试目的,我通过以下方式检查以确保存在标签为 100 的视图

for view in self.view.subviews {
    print(view.tag)
}

我看到输出为 100,但 XCode 显示

Thread 1: EXC_BAD_ACCESS(code=1, address... )

在这条线上

let view = self.view.viewWithTag(100)

【问题讨论】:

    标签: ios swift ios8 ios9


    【解决方案1】:

    不要使用标签。只是不要。苹果今年WWDC session(14:43)建议开发者不要再使用标签:

    所以我的意思是,如果您使用 View With Tag 或 Set Tag UIView API 和交付代码,我将鼓励您远离它。 .. 当您不仅没有收到编译器警告,而且您收到的任何运行时错误都不会说明您对 View With Tags 的使用。

    改用类属性 (IBOutlets)。这是当今最常见的做法。

    【讨论】:

    • 我正在以编程方式创建视图并添加它,因此没有 IBOutlet
    【解决方案2】:

    我的问题实际上不在

    self.view.viewWithTag 
    

    线。该行导致错误,但这是因为我将视图添加到

    中的层次结构
    viewWillLoad
    

    方法。这在 iOS 9 上仍然可以正常工作。

    我将视图的添加移到了

    viewDidLoad
    

    方法,它适用于 iOS8 和 iOS9

    【讨论】:

      【解决方案3】:

      如果您使用的是Nibs/XIB,问题可能是由于您的ViewController 未正确初始化造成的。

      此问题是由UIViewController 使用的默认init() 引起的

      我也遇到了这个问题,通过执行此代码 sn-p 解决了这个问题

      required init() {
          super.init(nibName: <nameOfYourNib>, bundle: nil)
      }
      
      required init?(coder aDecoder: NSCoder) {
          fatalError("init(coder:) has not been implemented")
      }
      

      【讨论】:

      • 其他用户可能会觉得这很有帮助,那么为什么要投反对票呢? @Sulthan 他也从未将他的答案标记为正确的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 2016-06-07
      相关资源
      最近更新 更多