首页 > 解决方案 > 在委托方法中调用 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 行

我所有的插座仍然连接,那么为什么会抛出这个错误?

标签: iosswiftxcodedelegates

解决方案


您的代码有 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 ?。)这不太可能导致您的崩溃,但它仍然是一个非常糟糕的与选项有关的事情。


推荐阅读