2016-09-26 144 views
0

我目前有一個ViewController,裏面有一個TableView,它叫做SelectedListItemsViewController。此ViewControllerTableView由稱爲SelectedListItemsTableViewCell的自定義單元類填充。如何使用UIStepper更改Realm模型對象中的屬性?

我有一個叫做selectedListItems的Realm模型對象數組,每個對象都有幾個屬性。 SelectedListItemsTableViewCell使用indexPath.row的對象的listItem屬性填充TableView,並且每行具有UIStepper,其旁邊有UILabel(現在爲止)每行顯示UIStepper.value。理想情況下,標籤將反映每行的listItemWeight屬性,並在增加或減少該行時對其進行更改。

這是我的自定義單元格:

class SelectedListItemsTableViewCell: UITableViewCell { 

    @IBOutlet var selectedListItemLabel: UILabel! 
    @IBOutlet weak var listItemWeightLabel: UILabel! 
    @IBOutlet weak var stepperControl: UIStepper! 

    @IBAction func stepperValueChanged(sender: UIStepper) { 

     listItemWeightLabel.text = Int(sender.value).description 

    } 
} 

在我ViewControllercellForRowAtIndexPath,我已經配置的小區,像這樣:

// Configure the cell... 
    cell.selectedListItemLabel.text = selectedListItems[indexPath.row].listItem 

    cell.listItemWeightLabel.text = "\(selectedListItems[indexPath.row].listItemWeight)" 

這完全加載listItem屬性和listItemWeight屬性正確顯示,但只要我在UIStepper上增加或減少,它就會變得混亂。

如何正確地將我的UILabel和UIStepper鏈接到[indexPath.row].listItemWeight

回答

0

以上回答是導致我對我的問題的實際解決方案有幫助的,但如果有人在未來的好奇 - 我最終使用封閉。

在我的自定義單元格級,我做

@IBAction func stepperValueChanged(sender: UIStepper) { 

    selectedListItemLabel.text = Int(sender.value).description 
    tapped?(self) 

} 

而且在我的視圖控制器,我做

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! SelectedListItemsTableViewCell 

    cell.stepperControl.value = selectedListItems[indexPath.row].listItemWeight 

    // Configure the cell... 

    cell.tapped = { (selectedCell) -> Void in 

     selectedListItems[indexPath.row].listItemWeight = cell.stepperControl.value 

    } 

這讓我訪問每個細胞的UIStepper在視圖控制器文件。

它有助於閱讀this thread中的flashadvanced選項2的答案。

0

在步進器更新時被調用的相同方法中,更新您的listItem。但是,由於此項存儲在您的Realm數據庫中,因此您必須獲取Realm數據庫的實例並將更改寫入數據庫。

你可以通過讓你的TableViewCell堅持listItem的一個實例來做到這一點。您的新TableViewCell類將是這個樣子:

class SelectedListItemsTableViewCell: UITableViewCell { 

    @IBOutlet var selectedListItemLabel: UILabel! 
    @IBOutlet weak var listItemWeightLabel: UILabel! 
    @IBOutlet weak var stepperControl: UIStepper! 

    var listItem: Item? 

    @IBAction func stepperValueChanged(sender: UIStepper) { 
     listItemWeightLabel.text = Int(sender.value).description 
     if let listItem = listItem { 
      let realm = try! Realm 
      try! realm.write { 
       listItem.listItemWeight = Int(sender.value) ?? 0 
      } 
     } 
    } 
} 
+0

感謝您的意見,Nathan!我無法更新UIStepper更新(stepperValueChanged)的方法中的listItem,因爲據我所知(雖然這不是說很多,因爲我是編程新手),它需要一個indexPath.row來訪問該特定對象的屬性,我沒有在自定義單元類中。我在這方面錯了嗎?如果您的'SelectedListItemsTableViewCell'具有對listItem的引用(來自該數組),那麼我會收到警告「Value of type'[RealmListItem]'沒有成員'listItemWeight'' – MachTurtle

+0

你應該可以更新它。 –

+0

道歉,如果這是一個非常天真的問題,但我怎麼會從我的'SelectedListItemsTableViewCell'引用我的數組(它是全局的),以便我可以更新該行的屬性中的對象?我一直在尋找過去20分鐘的時間,但Google正在以不同於我們這裏所說的方式來解釋「參考」。 – MachTurtle

相關問題