swift - iOS 9.0 以下的分段控件 addTarget() 崩溃应用程序

标签 swift xcode uisegmentedcontrol addtarget

我的应用最近发布了,但它支持 iOS 8.2。

不幸的是,在 iOS 9.0 以下点击以编程方式添加的分段控件会使应用程序崩溃,并且控制台中没有错误消息。

我认为添加目标的行可能会导致问题:

以下行放在我的自定义单元格的 init() 中,分段控件是一个实例变量,并在其父 View Controller 中调用一个方法

segmentedControl.addTarget(ListViewController(), action: #selector(ListViewController.segmentedControlToggled(segmentedControl:)), for: .valueChanged)

同样,这在 iOS 9.0 下也能正常工作。

设置工作正常,只有在点击分段控件后才会崩溃。

选择器是否应该有另一种语法?

感谢您的任何建议!

最佳答案

根据 addTarget 的文档:

The control does not retain the object in the target parameter. It is your responsibility to maintain a strong reference to the target object while it is attached to a control.

这意味着您需要将 target 参数的值存储在某处,但您未能实现:

segmentedControl.addTarget(ListViewController(),...)

ListViewController 将在没有其他引用时立即被释放,这里要记住的重要一点是您无法提前知道释放何时发生,因为您不知道其他对象将如何引用您的对象。

要确保目标不会被释放,请将 ListViewController 实例存储到一个属性中。

崩溃不是 iOS 版本特有的,可能是在某些 iOS 版本上 ListViewController 被释放得更快。

关于swift - iOS 9.0 以下的分段控件 addTarget() 崩溃应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42052555/

相关文章:

ios - 在没有 Segue 的情况下单击第一个 ViewController 上的按钮后更改第二个 ViewController 的标签文本

ios - 从 url 方案中获取文本字符串在 appdelegate 中有效,但在 viewcontroller 中无效

ios - `-fembed-bitcode` 尝试存档应用程序时出错

objective-c - 使用选项卡栏 Controller 对导航栏进行分段控制

ios - iOS13后Segmented Controller背景变灰

objective-c - 如何从单独的 IBAction 中检测 UISegmentedControl 的变化

ios - 像 Tinder 一样自定义 UISegmentedControl - Swift 3

ios - 与 Swift StreamVideo SDK 命名冲突

ios - 在基类或扩展 Swift 的静态方法中获取派生类型的类型名称

iphone - CoreData内存管理问题