全局初始化变量在Swift UIView XIB中更改为'nil'?
我在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)
}
做这些检查,看看你的代码如下一样。 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()
为什么我需要调用操作方法picker.saveStatus(self)??? – fAiSaL
你不用这只是一个示例,因为这是一个'IBAction',如果你将它与Storyboard/XIB中的按钮连接起来,那么按钮实例就会被传递给它。 –
我发现了解决方案,而不仅仅是一个错误。我使用的“CustomPickerMenu”类不止一次被调用。在init(帧)和init(解码器)期间。这就是字符串的初始值在第一次调用期间分配的原因,并在第二次调用期间更改为零的原因。
我最初通过故事板将代表连接到xib,然后从一个视图控制器调用xib类,最终调用xib init(frame)。我编写了代码来将xib加载到init(框架)中。由于我已经将xib与故事板连接起来,xib也会将其称为init(编码器)方法。
所以我做的是,从故事板中删除委托并在其init(框架)中调用“self.pickerView.delegate”和“self.pickerView.dataSource”,最终init(编码器)方法停止调用。
现在,字符串的值不会改变。
把问题的实际代码代替图像 – Rajat
1.作为@Rajat在上面的评论中提到,添加代码不是图像。 2.在实际尝试访问变量的地方添加代码,并将其找到为空。 – lukya
这里是完整的代码 – fAiSaL