2015-04-02 18 views
2

我一直在反對這個好幾天了,嘗試了許多不同的方法。我有一個包含兩個UILabels的自定義單元的UITableView。在選擇單元格時,會顯示一個UIPicker,並且會設置一個引用了哪個單元格的變量。使用選定的UIPicker行作爲自定義UITableViewCell的文本UILabel SWIFT

一旦在UIPicker中進行了選擇,我需要獲取該值並用它來替換其中一個單元格標籤的現有.text。我已經嘗試使用.viewWithTag幾種不同的方式(首先標籤標籤本身,然後整個單元格),沒有任何工作。

我didSelect的選擇器是:

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     println("pickerView did select row \(row)") 

     if(self.getStatus() == "newFirst"){ 
      switch (editingField){ 
      case 0: 
       var l:NewOrderCell! = tableView.viewWithTag(editingField) as? NewOrderCell 
       //the label in the custom cell is called 'Text' 
       l.Text.text = pickerData[row] 
       println("should be changing \(l.Text.text) into \(pickerData[row])") 
      default: 
       var l:NewOrderCell! = tableView.viewWithTag(editingField) as? NewOrderCell 
       l.Text.text = pickerData[row] 
      } 
     } 
     picker.hidden=true 
    } 

和我對錶的cellForRowAtIndexPath是:

var cell:NewOrderCell = tableView.dequeueReusableCellWithIdentifier("NewOrderCell") as NewOrderCell 
       //label 
       cell.Label.text = self.newOrder[indexPath.row] 
       //text 
       cell.Text.text = "Please Select" 
       cell.tag = indexPath.row 
       return cell 

我知道我的目標,但在適當的方式不能獲得一個句柄從另一種方法引用表格中的單元格。感謝您的幫助

+0

你嘗試使用委託?您可以子類UIPicker,在該類中定義協議並在您的tableview中實現這些協議功能。將subClassed UIPIcker的委託設置爲tableview,並在table view類中實現一個以文本和單元索引作爲輸入並更新相同的函數。如果您想要代碼,請回複評論。 – 2015-04-02 05:09:23

回答

1

我想出了一個可行的解決方案,但我感覺不夠優雅,難以維護:當選擇器行被選中時,該文本被寫入用於最初填充表的數組(覆蓋原始項目),然後重新加載表格,以便出現新值。因此,它是這樣的:

var truth: [String:String] = ["Key1":"","Key2":"","Key3":""] 
var keys:[String] = ["Key1", "Key2","Key3"] 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
var cell:NewOrderCell = tableView.dequeueReusableCellWithIdentifier("NewOrderCell") as NewOrderCell 
    //label 
    cell.Label.text = keys[indexPath.row] 
    //textfield 
    if(truth[keys[indexPath.row]] == ""){ 
      cell.Text.text = "Please Select" 
    } 
    else{ 
      cell.Text.text = truth[keys[indexPath.row]] 
    } 
    return cell 
} 

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    truth[keys[editingField]] = pickerData[row] 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     self.tableView.reloadData() 
    }) 

} 

高興聽到更好的解決方案

+0

'[self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:@ [indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone]; [self.tableView endUpdates];' – 2015-04-02 05:11:36

+0

非常好,謝謝。你對代表和子類的評論聽起來最好,但有點超出我的舒適程度和時間表。 – 2015-04-02 05:18:43

相關問題