2015-04-12 31 views
1

我有困難,我覺得應該工作,我想知道是否有一些事情,我不知道初始化IBOutlets的值。如何使用初始化程序爲IBOutlet賦值?

所以我創建了一個有三個IBOutlets的類。然後,我爲這些插座變量創建了初始化器。當我創建該類的新實例並傳遞硬編碼值時,我得到作爲回報。

所以我println()編輯傳入的settingLabel值以確保傳入的參數確實帶有一個值,它返回爲「hello」。然後我嘗試將值分配給設置標籤文本,但是當我調用println(settingsLabel.text)時返回爲

enter image description here (線程1:EXV_BAD_INSTRUCTION(代碼= EXC_I386_INVOP,子碼=爲0x0))

我的問題是:

缺少什麼我在這裏和/或如何分配一個IBOutlet一個初始值的值?

這是我調用初始化:

let cell = SettingCell(settingLabel: "hello", settingSwitch: true, timeSetting: 3) 

這是我SettingCell.swift類:

class SettingCell: UITableViewCell { 

    @IBOutlet weak var settingsLabel: UILabel! 
    @IBOutlet weak var settingsSwitch: UISwitch! 
    @IBOutlet weak var timeSetting: UILabel! 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 
    } 

    init(settingLabel: String, settingSwitch: Bool, timeSetting: NSNumber) { 

     println(settingLabel) // returns hello <-------------------- 

     super.init(style: .Default, reuseIdentifier: "SwitchSettingCell") 
     settingsLabel.text = settingLabel 
     self.settingsSwitch.on = settingSwitch 
     self.timeSetting.text = timeSetting.description as String 

     println(settingsLabel.text) // returns nil <-------------------- 

    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 


    var cellDelegate: SettingCellDelegate? 


    @IBAction func handledSwitchChange(sender: UISwitch) { 

     self.cellDelegate?.didChangeSwitchState(sender: self, isOn:settingsSwitch!.on) 


    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     // Configure the view for the selected state 
    } 

} 

myStoryboard:

enter image description here

+1

的settingsLabel它不是一個可選 –

+0

我是在故障排除與自選玩,感謝指出了這一點,我已經測試並更新了帖子以反映當前失敗的代碼。 –

回答

1

IBOutlet關鍵字只是一種告訴Xcode視圖應該在故事板內可見的方式。您可以在故事板中連接這些插座,並且這樣做會導致變量被實例化爲&,作爲故事板的子視圖而不是代碼。

在您的代碼中,您是以編程方式創建單元格,而不是從故事板創建(實際上,如果您嘗試從故事板創建它們,則應用程序會崩潰,因爲您尚未實現init(coder:))。正因爲如此,你的變量沒有理由成爲「出路」,並且不會被初始化。您必須自己初始化它們,將它們作爲子視圖&設置約束添加,全部用代碼表示。

在你的初始化程序中,你的代碼是無效的,因爲你的變量仍然是nil。事實上,在你的編輯中,你刪除了可選的鏈接?,這會導致應用程序崩潰,因爲變量是強制解包的,但是是nil。這是println(settingsLabel.text)崩潰的原因。


編輯:

好了,你的問題是,你想從故事板初始化你的細胞,但你不是做編程調用您的自定義初始化器。

let cell = tableView.dequeueReusableCellWithIdentifier("SettingsCell", forIndexPath: indexPath) as! SettingCell 

(這是假設你已經給你的原型標識符「SettingsCell」在故事板)

每當一個觀點是:在tableView(_:cellForRowAtIndexPath:),你從重用隊列中出隊一個讓你的細胞由故事板創建,因此使用視圖的init(coder:)初始化程序,因此您必須在SettingCell子類中提供此實現。一旦該單元出隊後,該單元的出口將被初始化並添加爲該單元的子視圖。

所以出列單元格後,您可以設置您的標籤和開關:

cell.settingsLabel.text = //... 
cell.settingsSwitch.on = //... 
cell.timeSetting.text = //... 
+0

我已更新我的帖子以顯示我的故事板,我有標籤和開關的連接......是這個問題嗎? –

+0

所以,基本上你說的是,如果我想通過將它們傳遞到我的SettingsCell()來創建單元格,那麼我需要以編程方式執行而不使用故事板?此外,以前我使用dequeReusableCellWithIdentifier創建單元格並將其作爲SettingCell進行投射。 –

+1

是的,您只能以編程方式調用自定義的初始化程序。對於表格視圖單元格,我強烈建議您不要這樣做,並建議您讓表格視圖通過故事板爲您創建它們。我編輯了答案來詳細說明這一點。 – Stuart

相關問題