使用选定的 UIPicker 行作为自定义 UITableViewCell UILabel SWIFT 的文本

Posted

技术标签:

【中文标题】使用选定的 UIPicker 行作为自定义 UITableViewCell UILabel SWIFT 的文本【英文标题】:Use selected UIPicker row as text for custom UITableViewCell UILabel SWIFT 【发布时间】:2015-04-02 02:45:11 【问题描述】:

我这几天一直在反对这个,尝试了许多不同的方法。我有一个 UITableView,其中包含两个 UILabel 的自定义单元格。选择单元格时,会显示一个 UIPicker,并设置一个变量来引用哪个单元格被点击。

在 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

我知道我的目标,但无法掌握从其他方法引用表格中单元格的正确方法。感谢您的帮助

【问题讨论】:

您尝试过使用委托吗?您可以对 UIPicker 进行子类化,在该类中定义协议并在表格视图中实现这些协议功能。将子类 UIPIcker 的委托设置为 tableview 并在 table view 类中实现一个函数,该函数将文本和单元格索引作为输入并更新相同。如果您需要代码,请回复评论.. 【参考方案1】:

I have come up with a solution that works, but I feel is inelegant and hard to maintain: when the picker row is selected, that text is written to the array that was used to originally populate the table (overwriting the original item ),然后我重新加载表,以便出现新值。所以,它是这样的:

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()
    )


很高兴听到更好的解决方案

【讨论】:

不用重新加载整个表格视图,你可以试试这个:[self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone]; [self.tableView endUpdates]; 非常好,谢谢。您对代表和子类化的评论听起来最好,但有点超出我的舒适度和时间表。

以上是关于使用选定的 UIPicker 行作为自定义 UITableViewCell UILabel SWIFT 的文本的主要内容,如果未能解决你的问题,请参考以下文章

在按钮点击时为选定的行设置动画

从自定义数据源中获取选定的行?

Swift:使用 UIPicker 自定义 DatePicker

Ag Grid 自定义(选定)行样式

自定义UIPicker控件IOS

Datagridview如何将选定的行转换为自定义对象