динамическое создание кнопки просмотра таблицы в ячейке в swift - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь реализовать динамическую кнопку в ячейке табличного представления. Я могу добавить кнопку, но в соответствии с требованием к последней ячейке я не хочу добавлять кнопку, но ее добавление туда также как снимок экрана, упомянутый ниже

enter image description here

Это требование, код моего cellForRowAt indexPath приведен ниже.

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
    if let _ = cell {
        print("cell is available")
    } else {
        cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
    }
    cell?.textLabel?.textAlignment = .left
    cell?.textLabel?.text = list[indexPath.row]
    let btn = UIButton(type: UIButtonType.custom) as UIButton

    if cell?.textLabel?.text == "➕ Add Room" || list[indexPath.row] == "➕ Add Room"{
        btn.isHidden = true
        cell?.textLabel?.textAlignment = .center
    }else{
        btn.frame = CGRect(x: 146, y: 0, width: 20, height: (cell?.frame.height)!)
        btn.addTarget(self, action: #selector(buttonPressed(sender: )), for: .touchUpInside)
        btn.tag = indexPath.row
        btn.setImage(UIImage(named: "delete.png"), for: .normal)
        cellx = list[btn.tag]
        cell?.contentView.addSubview(btn)
    }
    return cell!
}

и результат после этого показа ниже снимок экрана

enter image description here

Я не хочу отображать кнопку удаления в строке + Добавить комнату, которая присутствует в последней строке таблицы.Пожалуйста, предложите мне, как получить как упоминание в требовании.я сделал условие, чтобы текст («Добавить текст комнаты») отображался в центре и успешно отображался в центре.Спасибо заранее, пожалуйста, помогите мне решить эту проблему

2-й выпуск

в этом списке, если я выберу "COPENHAGEN" и попытаюсь удалить это, удалив верхнююсодержание означает, что файл BARCELONA будет удален.я не удаляю такое же выбранное содержимое из списка.

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Это происходит потому, что UITableView повторно использует ранее созданные ячейки.Так что для последней ячейки требуется уже созданная ячейка с кнопкой внутри.

Было бы лучше создать собственный подкласс UITableViewCell и использовать его.

Но если вы не хотите делатьчто вы можете использовать эту версию вашего кода:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
    if let cell = cell {
        print("cell is available")
        // Remove previously created button from reused cell view
        if let button = cell.contentView.subviews.first(where: { (view: UIView) -> Bool in
            view.isKind(of: UIButton.self)
        }) {
            button.removeFromSuperview()
        }
    } else {
        cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
    }
    cell?.textLabel?.textAlignment = .left
    cell?.textLabel?.text = list[indexPath.row]

    if indexPath.row == (list.count - 1) {
        cell?.textLabel?.textAlignment = .center
    } else {
        let btn = UIButton(type: UIButtonType.custom) as UIButton
        btn.frame = CGRect(x: 146, y: 0, width: 20, height: (cell?.frame.height)!)
        btn.addTarget(self, action: #selector(buttonPressed(sender: )), for: .touchUpInside)
        btn.tag = indexPath.row
        btn.setImage(UIImage(named: "delete.png"), for: .normal)
        cellx = list[btn.tag]
        cell?.contentView.addSubview(btn)
    }
    return cell!
}
0 голосов
/ 25 февраля 2019
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
    if let _ = cell {
        print("cell is available")
    } else {
        cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
    }
    cell?.textLabel?.textAlignment = .left
    cell?.textLabel?.text = list[indexPath.row]
    let btn = UIButton(type: UIButtonType.custom) as UIButton

    if cell?.textLabel?.text == "➕ Add Room" || list[indexPath.row] == "➕ Add Room"{
        for view in cell?.contentView.subviews as [UIView] {
            if let button = view as? UIButton {
               button.isHidden = true
            }
        }
        cell?.textLabel?.textAlignment = .center
    }else{
        btn.frame = CGRect(x: 146, y: 0, width: 20, height: (cell?.frame.height)!)
        btn.addTarget(self, action: #selector(buttonPressed(sender: )), for: .touchUpInside)
        btn.tag = indexPath.row
        btn.setImage(UIImage(named: "delete.png"), for: .normal)
        cellx = list[btn.tag]
        cell?.contentView.addSubview(btn)
    }
    return cell!
}

Попробуйте это.Это из-за потока вашей программы.Экземпляр btn создается для каждой строки таблицы, и вы устанавливаете скрытым только экземпляр btn для последней строки.Ячейка таблицы повторно использовала ячейку очереди, даже если вы не добавили созданный btn в представление содержимого ячейки таблицы для последней ячейки.Итак, вам нужно найти кнопку в представлении содержимого и установить скрытый.

0 голосов
/ 25 февраля 2019

Попробуйте таким образом

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! cell

 if indexPath.row == (list.count - 1) {
        btn.isHidden = true
        cell?.textLabel?.textAlignment = .center
    }else{
        btn.isHidden = false
        btn.frame = CGRect(x: 146, y: 0, width: 20, height: (cell?.frame.height)!)
        btn.addTarget(self, action: #selector(buttonPressed(sender: )), for: .touchUpInside)
        btn.tag = indexPath.row
        btn.setImage(UIImage(named: "delete.png"), for: .normal)
        cellx = list[btn.tag]
        cell?.contentView.addSubview(btn)
    }

Я не проверял этот код выше, только что внес некоторые незначительные изменения, может быть, это будет работать :) Если нет, пожалуйста, дайте мне знать.

РЕДАКТИРОВАТЬ1: Ответобновленный

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...