在委托方法中调用 IBOutlet 变量时出现错误
get a error, when calling IBOutlet variable inside a delegate Method
我为我的选择器视图创建了一个额外的 class。当我按下 BarButtonItem 和一个普通按钮时,会显示一个 PickerView。这很好用。
我希望当我 select 一个项目时按钮的标题被更改。
我和一个代表一起试试这个。
在我的选择器中 class 我创建了一个协议:
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: { [=10=].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))
}
}
一旦值被 selected,委托就会被执行。
我已经让我的另一个 class 符合协议。
class HomeViewController: UIViewController, CodeDelegate {
@IBOutlet weak var pickRegion: UIBarButtonItem!
func getCode(code: String) {
pickRegion.title = code
}
}
在Delegate 方法中,我想将传递的字符串分配给按钮。但是,我在那里收到错误消息:
Projekt[7585:218750] Fatal error: Unexpectedly found nil while
implicitly unwrapping an Optional value: file
Projekt/HomeViewController.swift, line 270
我所有的网点仍然连接,为什么会抛出这个错误?
您的代码有 2 个不同的问题。
首先,您使用代码 codeDelegate = HomeViewController(). The expression HomeViewController()
设置选择器的委托创建一个新的空 HomeViewController 实例,它与屏幕上的任何内容都无关。创建一个像这样的视图控制器不会让它从它的 storyboard/XIB 文件加载它的视图,所以它的出口将为零。这为您的崩溃做好了准备,因为当您调用委托方法时,您的视图控制器将尝试调用 nil 的插座。您应该从 HomeViewController 设置委托。
类似于以下内容:
let picker = Picker()
picker.delegate = self
你代码的第二个问题是一个非常坏的习惯。如果 codeDelegate
为零,行 codeDelegate!.getCode(code: String(regionCode))
将崩溃。 (!
是“强制展开”运算符,也称为“如果为零则崩溃”运算符。)您应该改为使用 codeDelegate?.getCode(code: String(regionCode))
(将 !
更改为 ?
.) 这不太可能是导致崩溃的原因,但使用可选值仍然是一件非常糟糕的事情。
我为我的选择器视图创建了一个额外的 class。当我按下 BarButtonItem 和一个普通按钮时,会显示一个 PickerView。这很好用。 我希望当我 select 一个项目时按钮的标题被更改。
我和一个代表一起试试这个。
在我的选择器中 class 我创建了一个协议:
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: { [=10=].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))
}
}
一旦值被 selected,委托就会被执行。
我已经让我的另一个 class 符合协议。
class HomeViewController: UIViewController, CodeDelegate {
@IBOutlet weak var pickRegion: UIBarButtonItem!
func getCode(code: String) {
pickRegion.title = code
}
}
在Delegate 方法中,我想将传递的字符串分配给按钮。但是,我在那里收到错误消息:
Projekt[7585:218750] Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file Projekt/HomeViewController.swift, line 270
我所有的网点仍然连接,为什么会抛出这个错误?
您的代码有 2 个不同的问题。
首先,您使用代码 codeDelegate = HomeViewController(). The expression HomeViewController()
设置选择器的委托创建一个新的空 HomeViewController 实例,它与屏幕上的任何内容都无关。创建一个像这样的视图控制器不会让它从它的 storyboard/XIB 文件加载它的视图,所以它的出口将为零。这为您的崩溃做好了准备,因为当您调用委托方法时,您的视图控制器将尝试调用 nil 的插座。您应该从 HomeViewController 设置委托。
类似于以下内容:
let picker = Picker()
picker.delegate = self
你代码的第二个问题是一个非常坏的习惯。如果 codeDelegate
为零,行 codeDelegate!.getCode(code: String(regionCode))
将崩溃。 (!
是“强制展开”运算符,也称为“如果为零则崩溃”运算符。)您应该改为使用 codeDelegate?.getCode(code: String(regionCode))
(将 !
更改为 ?
.) 这不太可能是导致崩溃的原因,但使用可选值仍然是一件非常糟糕的事情。