寻找有关如何在 UITableViewCell 中嵌入 UITextField 的示例

Posted

技术标签:

【中文标题】寻找有关如何在 UITableViewCell 中嵌入 UITextField 的示例【英文标题】:Looking for an example on how to embed a UITextField in a UITableViewCell 【发布时间】:2020-12-16 03:05:10 【问题描述】:

我有一个内置 UISwitch 的工作 UITableView。我希望有一行使用 UITextField。它在第一次显示时有效,但如果我离开屏幕然后回来,标签就会消失,UITextField 会被推到左边。

这是我第一次进入“设置”选项卡时的显示方式:

当我翻到“主页”选项卡(或任何其他选项卡)并返回“设置”选项卡时,我得到以下信息:

我不知道为什么。

这里是有问题的代码:

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

    let defaults = UserDefaults.standard
    let cell = tableView.dequeueReusableCell(withIdentifier: K.cellIdentifier, for: indexPath)
    var switchTag = 0
    var switchState = false

    switch indexPath.section 
    case SETTINGS_SECTION:
        cell.textLabel?.text =  settings[indexPath.row].name
        switchTag = settings[indexPath.row].tag
        switchState = defaults.bool(forKey: "metric")
        break
    case UPLOADS_SECTION:
        cell.textLabel?.text =  uploads[indexPath.row].name
        switchTag = uploads[indexPath.row].tag
        if indexPath.row == 0 
            switchState = defaults.bool(forKey: "strava")
         else if indexPath.row == 1 
            switchState = defaults.bool(forKey: "cycling_analytics")
        
        break
    case DEVICES_SECTION:
        let device = devices[indexPath.row]
        cell.textLabel?.text =  device.name
        switchTag = device.tag
        if deviceManager!.savedDevices.firstIndex(of: device.id) != nil 
            switchState = true
         else 
            switchState = false
        
        
    default:
        break
        
    
    
    if switchTag == 2 
        
        txtFTP = UITextField(frame: CGRect(x: 300, y: 1, width: 50, height: 50))
        //txtFTP = UITextField(frame: .zero)
        cell.accessoryView = txtFTP
         
        let defaults = UserDefaults.standard
        let ftp = defaults.string(forKey: "FTP")

        if ftp == nil 
            txtFTP.placeholder = "FTP"
         else 
            txtFTP.text = ftp
        
        txtFTP.borderStyle = .roundedRect
        txtFTP.translatesAutoresizingMaskIntoConstraints = false
        txtFTP.font = UIFont.systemFont(ofSize: 15)
        txtFTP.addTarget(self, action: #selector(valueChanged), for: .editingChanged)
        txtFTP.delegate = self
        txtFTP.keyboardType = .numberPad
        cell.accessoryView = txtFTP
        
     else 
        let switchView = UISwitch(frame: .zero)
        switchView.setOn(switchState, animated: true)
        switchView.tag = switchTag // for detect which row switch Changed
        switchView.addTarget(self, action: #selector(self.switchChanged(_:)), for: .valueChanged)
        cell.accessoryView = switchView
    
    
    return cell


我首先按照这里的指南解决了这个问题:https://programmingwithswift.com/create-a-custom-uitableviewcell-with-swift/

我在故事构建器中创建了一个新的 nib,然后创建了代表该新自定义单元格的 swift 文件(如上面的链接中所做的那样)。

然后我把上面的代码改成:

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

    let defaults = UserDefaults.standard
    let cell = tableView.dequeueReusableCell(withIdentifier: K.cellIdentifier, for: indexPath)
    var switchTag = 0
    var switchState = false
    
    switch indexPath.section 
    case SETTINGS_SECTION:
        switchTag = settings[indexPath.row].tag
        if switchTag == 2 
            if let customCell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell") as? CustomTableViewCell 
                return customCell
            
        
        
        cell.textLabel?.text =  settings[indexPath.row].name
        switchTag = settings[indexPath.row].tag
        switchState = defaults.bool(forKey: "metric")
        break
    case UPLOADS_SECTION:
        cell.textLabel?.text =  uploads[indexPath.row].name
        switchTag = uploads[indexPath.row].tag
        if indexPath.row == 0 
            switchState = defaults.bool(forKey: "strava")
         else if indexPath.row == 1 
            switchState = defaults.bool(forKey: "cycling_analytics")
        
        break
    case DEVICES_SECTION:
        let device = devices[indexPath.row]
        cell.textLabel?.text =  device.name
        switchTag = device.tag
        if deviceManager!.savedDevices.firstIndex(of: device.id) != nil 
            switchState = true
         else 
            switchState = false
        
        
    default:
        break
        
    
    
    let switchView = UISwitch(frame: .zero)
    switchView.setOn(switchState, animated: true)
    switchView.tag = switchTag // for detect which row switch Changed
    switchView.addTarget(self, action: #selector(self.switchChanged(_:)), for: .valueChanged)
    cell.accessoryView = switchView
    return cell

一切都按预期进行。

【问题讨论】:

【参考方案1】:

你应该使用自定义 UITableViewCell。

class SettingsCell : UITableViewCell 
@IBOutlet weak var textLbl: UILabel!
@IBOutlet weak var switchCtrl: UISwitch!

【讨论】:

以上是关于寻找有关如何在 UITableViewCell 中嵌入 UITextField 的示例的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableviewCell 中的多行标签

如何在 UITableViewCell swift 中获得正确的 UIView 宽度

在 iOS 8 中如何在不使用自动布局的情况下布局 UITableViewCell?

UITableViewCell 中的 UICollectionView?

如何根据 UITableView 滚动动态调整 UITableViewCell 的大小?

如何在编辑模式下将子视图添加到 UITableViewCell 并调整其大小?