My app has been released recently but it supports iOS 8.2.
Unfortunately, below iOS 9.0 tapping a segmented control which has been added programmatically crashes the app with no error message in the console.
I believe that the line where the target is added may cause the issue:
The following line is placed inside the init() of my custom cell, the segmented control is an instance var and calls a method in its parent view controller
segmentedControl.addTarget(ListViewController(), action: #selector(ListViewController.segmentedControlToggled(segmentedControl:)), for: .valueChanged)
Again, this works as expected down to iOS 9.0.
The setup works fine, it only crashes once the segmented control is tapped.
Should there be another syntax for the selector?
Thanks for any suggestions!
Per the documentation of 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.
Which means that you need to store the value of the target
parameter somewhere, thing you fail to achieve:
segmentedControl.addTarget(ListViewController(),...)
The ListViewController
will get deallocated as soon as there will be no other references to it, the important thing to remember here is that you can't know in advance when the deallocation will happen, as you don't know how may other objects will refer your object.
To make sure the target doesn't get deallocated, store the ListViewController
instance into a property.
The crash is not particular to the iOS version, it might be that on some iOS version the ListViewController
gets deallocated sooner.