【问题标题】:Globally initialized variable changes to 'nil' in Swift UIView XIB?在 Swift UIView XIB 中全局初始化变量更改为“nil”?
【发布时间】:2017-04-13 02:52:23
【问题描述】:

我在 UIView 类中全局初始化了变量。

变量是statusLabel 作为字符串。我在 Pickerview didSelectRow 委托方法中为 statusLabel 分配了一个值。 我得到了字符串的值。但是当委托完成时,字符串的值更改为nil

所有其他全局初始化变量都是一样的。 可能是什么原因?

提前致谢

class CustomPickerMenu: UIView,UIPickerViewDataSource,UIPickerViewDelegate
{
    var statusLabel = String()

    var pickerArray = [String]()

    required init?(coder aDecoder: NSCoder)
    {
        pickerArray = ["None","Connections","All"]
        super.init(coder: aDecoder)
         print("Awake with coder")

    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    {
        if(row == 0)
        {
            statusLabel = pickerArray[row]
        }
        if(row == 1)
        {
            statusLabel = pickerArray[row]
        }
        if(row == 2)
        {
            statusLabel = pickerArray[row]
        }
      print("statusLabel : " + statusLabel)
    }

    @IBAction func saveStatus(_ sender: Any)
    {   
        delegate?.statusChange(controller: self, text:statusLabel)
        self.delegate?.showNavigationController(controller: self)

        print("statusLabel : " + statusLabel)
    }

这是在 didselectrow 委托(第一个三个输出)和保存状态(最后一个输出)期间 statusLabel 的输出

【问题讨论】:

  • 用实际代码代替图片
  • 1.正如上面评论中提到的@Rajat,添加代码而不是图像。 2. 在你实际尝试访问变量的地方添加代码,发现它为空。
  • 这里是完整的代码
  • 我已编辑您的问题,只保留相关代码。将来,请不要在不需要时在问题中添加“完整”代码。尽量让人们更容易理解您的问题。
  • 字符串的值变为'nil'是什么意思?它不是可选变量,因此它不能为零。您遇到错误或崩溃了吗?

标签: ios swift uiview xib


【解决方案1】:

进行这些检查,看看您的代码是否遵循相同的规则。 delegate 是一个弱变量。

  • 由于委托是可选的,请确保不要强制解包它。使用? 而不是!

  • 确保此委托指向的类正在实现协议。

  • 确保delegate 变量在实现的类中分配有self

一个示例游乐场演示。

class CustomPickerMenu
{
    var statusLabel = String()

    var pickerArray = [String]()
    weak var delegate:Sample?

    func call() {
        pickerArray = ["One", "Two"]
        print(pickerArray)
    }
    func pick()
    {
        statusLabel = pickerArray[0]
        print(statusLabel)
    }

    @IBAction func saveStatus(_ sender: Any)
    {
        print(statusLabel)
        self.delegate?.doSomething(data: statusLabel)
        print(statusLabel)
    }
}

class Apply: Sample {

    func test() {
        let picker = CustomPickerMenu()
        picker.call()
        picker.pick()
        picker.delegate = self
        picker.saveStatus(self)
    }
    func doSomething(data: String) {
        print(data)
    }
}

let apply = Apply()
apply.test()

【讨论】:

  • 您不必这样做。这只是一个示例。由于这是一个 IBAction ,如果您已将其与 Storyboard/XIB 中的按钮连接,则按钮实例将被传递给它。
【解决方案2】:

我找到了解决方案,但这是一个错误。我使用“CustomPickerMenu”的类被调用了不止一次。在 init(frame) 和 init(decoder) 期间。这就是字符串的值在第一次调用期间最初分配并在第二次调用期间更改为 nil 的原因。

我最初通过故事板将代理连接到 xib,然后我从一个视图控制器调用 xib 类,最终将调用 xib init(frame)。我编写了将 xib 加载到它的 init(frame) 中的代码。由于我已经将 xib 与 storyboard 连接起来,所以 xib 也会调用它的 init(coder) 方法。

所以我所做的是,从情节提要中删除委托,并在其 init(frame) 中调用“self.pickerView.delegate”和“self.pickerView.dataSource”,最终 init(coder) 方法停止调用。

现在,字符串的值没有改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-20
    相关资源
    最近更新 更多