ios - 在委托方法中调用 IBOutlet 变量时出现错误
问题描述
我为我的选择器视图创建了一个额外的类。当我按下 BarButtonItem 和普通按钮时,会显示 PickerView。这工作正常。我希望当我选择一个项目时按钮的标题会改变。
我和一个代表一起试试这个。
在我的选择器类中,我创建了一个协议:
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))
}
}
一旦选择了一个值,就会执行委托。
我已经让我的其他班级符合协议。
class HomeViewController: UIViewController, CodeDelegate {
@IBOutlet weak var pickRegion: UIBarButtonItem!
func getCode(code: String) {
pickRegion.title = code
}
}
在 Delegate 方法中,我想将传递的字符串分配给按钮。但是,我在那里得到错误:
Projekt [7585:218750] 致命错误:在隐式展开可选值时意外发现 nil:文件 Projekt/HomeViewController.swift,第 270 行
我所有的插座仍然连接,那么为什么会抛出这个错误?
解决方案
您的代码有 2 个不同的问题。
首先,您使用代码设置选择器的委托, codeDelegate = HomeViewController(). The expression HomeViewController()
创建一个新的、空的 HomeViewController 实例,该实例与屏幕上的任何内容都无关。创建一个像这样的视图控制器不会让它从它的故事板/XIB文件中加载它的视图,所以它的出口将是零。这为您的崩溃做好了准备,因为当您调用委托方法时,您的视图控制器将尝试调用 nil 的插座。您应该从 HomeViewController 设置委托。
类似于以下内容:
let picker = Picker()
picker.delegate = self
您的代码的第二个问题是一个非常坏的习惯。如果为 nil ,该行将codeDelegate!.getCode(code: String(regionCode))
崩溃。codeDelegate
(!
是“强制展开”运算符,也称为“crash if nil”运算符。)您应该改用codeDelegate?.getCode(code: String(regionCode))
(Change the !
to a ?
。)这不太可能导致您的崩溃,但它仍然是一个非常糟糕的与选项有关的事情。
推荐阅读
- python - Blender Python - 在导入所有类时强制重新加载模块
- omnet++ - 如何限制车辆在场景中的时间,使车辆自动离开?
- javascript - 对象编程迷失了:我的构造函数是“传统的”吗?我的代码是否正确考虑在内?
- postgresql - Hasura 查询在生产 Heroku 服务器上超时,但在 Heroku 登台服务器上快如闪电
- vue.js - Socket-IO 使用 Polling 而不是 Websocket
- c++ - 一旦输入了一个合数,涉及计算素数的代码就会停止工作。C++
- python-xarray - Xarray:切片坐标返回一个空维度
- python - 使用 aws cli 或 python 从 ec2 实例中删除安全组
- postman - 如何在 Postman 中创建 SAS 令牌以与服务总线一起使用?
- javascript - Angular 7+:如何从 api 端点静默实现刷新?