2016-11-29 49 views
3

我在UIView类中有全局初始化变量。全局初始化变量在Swift UIView XIB中更改为'nil'?

变量是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代表(第1三路输出)在输出statusLabel和保存状态(最后输出) enter image description here

+3

把问题的实际代码代替图像 – Rajat

+0

1.作为@Rajat在上面的评论中提到,添加代码不是图像。 2.在实际尝试访问变量的地方添加代码,并将其找到为空。 – lukya

+0

这里是完整的代码 – fAiSaL

回答

0

做这些检查,看看你的代码如下一样。 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() 
+0

为什么我需要调用操作方法picker.saveStatus(self)??? – fAiSaL

+0

你不用这只是一个示例,因为这是一个'IBAction',如果你将它与Storyboard/XIB中的按钮连接起来,那么按钮实例就会被传递给它。 –

1

我发现了解决方案,而不仅仅是一个错误。我使用的“CustomPickerMenu”类不止一次被调用。在init(帧)和init(解码器)期间。这就是字符串的初始值在第一次调用期间分配的原因,并在第二次调用期间更改为零的原因。

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

所以我做的是,从故事板中删除委托并在其init(框架)中调用“self.pickerView.delegate”和“self.pickerView.dataSource”,最终init(编码器)方法停止调用。

现在,字符串的值不会改变。