2016-11-29 120 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(編碼器)方法停止調用。

現在,字符串的值不會改變。