在委托方法中调用 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))(将 ! 更改为 ? .) 这不太可能是导致崩溃的原因,但使用可选值仍然是一件非常糟糕的事情。