【问题标题】:UIPickerView value inside of UITableView(based on DateCell) change detailLabelUITableView 内的 UIPickerView 值(基于 DateCell)更改 detailLabel
【发布时间】:2017-07-20 11:13:57
【问题描述】:

我试图让我的 PickerView 值显示在我的 UITableView 详细标签上。所以我设置在我的FormCell.swift

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  self.detailLabel.text = "\(component)\(row)"
}

但是,当我单击下一个单元格时,我的 detailLabel 会像这样错过以前的值。(我的默认标签是“01min 30sec”)

关于这个问题的任何想法?这是我关于这个问题的代码。

// FormCell.swift
import UIKit

class FormCell: UITableViewCell, UIPickerViewDelegate, UIPickerViewDataSource {

    // outlet
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var detailLabel: UILabel!
    @IBOutlet weak var pickerView: UIPickerView!

    // variable
    var isObserving = false
    let minutes = Array(0...59)

    // initialize pickerView delegate, dataSource
    override func awakeFromNib() {
        super.awakeFromNib()
        self.pickerView.delegate = self
        self.pickerView.dataSource = self

    }

    // tableViewCell's height setup
    class var expandedHeight: CGFloat { get { return 200 } }
    class var defaultheight: CGFloat { get { return 44 } }

    func checkHeight() {
        pickerView.isHidden = (frame.height < FormCell.expandedHeight)
    }


    // for pickerView
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 2
    }
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return minutes.count
    }
    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {

        let pickerLabel = UILabel()
        var titleData = ""
        titleData = "\(minutes[row])"
        pickerLabel.text = titleData
        return pickerLabel
    }
    func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
        return pickerView.frame.width / 3
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        self.detailLabel.text = "\(component)\(row)"
    }




    // set observer for expanding
    func watchFrameChanges() {
        if !isObserving {
            addObserver(self, forKeyPath: "frame", options: [NSKeyValueObservingOptions.new, NSKeyValueObservingOptions.initial], context: nil)
            isObserving = true;
        }
    }
    func ignoreFrameChanges() {
        if isObserving {
            removeObserver(self, forKeyPath: "frame")
            isObserving = false;
        }
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "frame" {
            checkHeight()
        }
    }

}

我的控制器

// AddCircuitVC.swift
import UIKit

class AddCircuitVC: UITableViewController {

    let formCellID = "formCell"
    var selectedIndexPath: IndexPath?


    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 9
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let itemData = dataArray[indexPath.row]
        var cellID = wordCellID

            cellID = formCellID
            let cell = tableView.dequeueReusableCell(withIdentifier: cellID) as? FormCell
            cell?.titleLabel.text = itemData[titleKey]

            return cell!


    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let previousIndexPath = selectedIndexPath

        if indexPath == selectedIndexPath {
            selectedIndexPath = nil
        } else {
            selectedIndexPath = indexPath
        }

        var indexPaths: Array<IndexPath> = []
        if let previous = previousIndexPath {
            indexPaths += [previous]
        }
        if let current = selectedIndexPath {
            indexPaths += [current]
        }

        if indexPaths.count > 0 {
            tableView.reloadRows(at: indexPaths, with: UITableViewRowAnimation.automatic)
        }

    }

    // observer
    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
            (cell as! FormCell).watchFrameChanges()
    }
    override func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
            (cell as! FormCell).ignoreFrameChanges()
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        for cell in tableView.visibleCells {
            if cell.isKind(of: FormCell.self) {
                (cell  as! FormCell).ignoreFrameChanges()
            }
        }
    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            if indexPath == selectedIndexPath {
                return FormCell.expandedHeight
            } else {
                return FormCell.defaultheight
            }
    }
}

【问题讨论】:

  • 看起来您添加了图片链接,但随后删除了帖子底部生成的链接。您可能需要重新添加它们。
  • @JamesWebster 哎呀。我重新生成了我的图像。现在还可以吗?
  • 是的,我现在可以看到它们了。
  • 感谢您的提及。

标签: uitableview swift3 uipickerview ios10


【解决方案1】:

您只是在pickerView 委托方法中设置表格单元格的self.detailLabel.text

因此,当您将单元格从屏幕上滚动然后再次在屏幕上时,表格视图单元格会“忘记”它之前设置的内容。

您需要修改cellForRowAt indexPath: 表视图数据源方法以返回cell.detailLabel.text 的值,这意味着您的最终数据源——dataArray 中的itemData 字典需要有一个选择器设置的持续时间的新条目。

我建议在 cellForRowAt indexPath: 中创建 customTableViewCell 时将 itemData 字典作为属性或参数传递,并且当用户选择持续时间时,设置字典条目并确保它被保存/更新你的dataArray

【讨论】:

  • 从你的答案中得到一个键后,我通过使用全局变量来解决这个问题。我知道它不是很好,但它有效。你能用示例代码告诉我你的答案,如果你不不介意吗?
【解决方案2】:

首先,我创建全局变量timeSetUp

import UIKit

var timeSetup: String!

class AddCircuitVC: UITableViewController {

其次,我从控制器编辑了cellForRowAt

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let itemData = dataArray[indexPath.row]
        var cellID = formCellID
        let cell = tableView.dequeueReusableCell(withIdentifier: cellID) as? FormCell
        cell?.titleLabel.text = itemData[titleKey]

        // indexPath Check
        if indexPath != selectedIndexPath {
           if let timeSetup = timeSetup {
               cell?.detailLabel.text = timeSetup
               print("\(timeSetup)")
            }
        } else {
            print("from else \(timeSetup)")
            // initialize value to default one.
            cell?.pickerView.selectRow(1, inComponent: 0, animated: true)
            cell?.pickerView.selectRow(30, inComponent: 1, animated: true)
            cell?.detailLabel.text = "01min 30sec"
        }
        return cell!
}

最后,当pickerView didSelectRow时,我从我的FormCell View 中获取detailLabel.text 的数据

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        self.detailLabel.text = "\(component)\(row)"
        // You can access timeSetup variable, because it's global
        timeSetup = self.detailLabel.text
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多