我在UIView
类中全局初始化了变量。
变量statusLabel
为字符串。我在Pickerview statusLabel
委托方法中为didSelectRow
分配了一个值。
在那里我得到了字符串的价值。但是,当委托完成字符串更改的值为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)
}
答案 0 :(得分:1)
我找到了解决方案,而不是错误。我使用过的“CustomPickerMenu”类不止一次被调用过。在init(帧)和init(解码器)期间。这就是字符串的值在第一次调用期间最初分配的原因,并且在第二次调用期间变为nil。
我最初通过故事板将委托连接到xib,然后我从一个视图控制器调用xib类,最终将调用xib init(frame)。我编写了代码来加载xib的init(frame)。由于我已经将xib与故事板连接在一起,因此xib也将其称为init(编码器)方法。
所以我做的是,从storyboard中删除了委托,并在其init(frame)中调用了“self.pickerView.delegate”和“self.pickerView.dataSource”,最终init(编码器)方法停止调用。
现在,string的值没有变化。
答案 1 :(得分: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()