I have created an extra class for my picker view. A PickerView is shown as I press a BarButtonItem and a normal button. This works fine. I want that when I select an item the title of the button is changed.
I try this with a delegate.
In my picker class I have created a protocol:
protocol CodeDelegate {
func getCode(code: String)
}
class Picker: UIPickerView {
var codeDelegate: CodeDelegate?
func setupPickerViewForRegion(view: UIView, barButtonItem: UIBarButtonItem) {
codeDelegate = HomeViewController()
barButtonRegion = barButtonItem
viewFromController = view
createToolbar()
closeWhenTapOnScreen()
UIApplication.shared.windows.first(where: { $0.isKeyWindow })?.addSubview(blurScreenView)
view.addSubview(textField)
textField.inputView = pickerView
textField.becomeFirstResponder()
}
.
.
.
.
}
extension Picker: UIPickerViewDelegate {
.
.
.
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let regionCode = regions[row].prefix(2)
codeDelegate!.getCode(code: String(regionCode))
}
}
Once a value is selected, the delegate is executed.
I have made my other class conform to the Protocol.
class HomeViewController: UIViewController, CodeDelegate {
@IBOutlet weak var pickRegion: UIBarButtonItem!
func getCode(code: String) {
pickRegion.title = code
}
}
In the Delegate method, I want to assign the passed string to the button. However, I get the error there:
Projekt[7585:218750] Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file Projekt/HomeViewController.swift, line 270
All my outlets are still connected, so why this error is thrown?