【问题标题】:get a error, when calling IBOutlet variable inside a delegate Method在委托方法中调用 IBOutlet 变量时出现错误
【发布时间】:2020-12-10 12:56:59
【问题描述】:

我为我的选择器视图创建了一个额外的类。当我按下 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 行

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

【问题讨论】:

    标签: ios swift xcode delegates


    【解决方案1】:

    您的代码有 2 个不同的问题。

    首先,您使用代码 codeDelegate = HomeViewController(). The expression HomeViewController() 设置选择器的委托,创建一个新的、空的 HomeViewController 实例,该实例与屏幕上的任何内容无关。创建一个像这样的视图控制器不会让它从它的故事板/XIB文件中加载它的视图,所以它的出口将是零。这为您的崩溃做好了准备,因为当您调用委托方法时,您的视图控制器将尝试调用 nil 的插座。您应该从 HomeViewController 设置委托。

    类似于以下内容:

    let picker = Picker() 
    picker.delegate = self
    

    您的代码的第二个问题是一个非常坏的习惯。如果codeDelegate 为nil,codeDelegate!.getCode(code: String(regionCode)) 行将崩溃。 (! 是“强制展开”运算符,也称为“crash if nil”运算符。)您应该改用codeDelegate?.getCode(code: String(regionCode))(将! 更改为?。)这不太可能导致您崩溃的原因,但使用可选选项仍然是一件非常糟糕的事情。

    【讨论】:

    • 哦,是的,我明白了。这是我自己一个可怕的错误。我在我的 HomeViewController 中设置了委托,现在它工作正常。谢谢!
    • 通过调用它的初始化程序(例如直接ViewControllerClass())来创建视图控制器几乎总是错误的。唯一不是这样的情况是视图控制器在代码中创建其视图层次结构,而不是从 Storyboard 或 XIB 文件中加载它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多