Как программно удалить UIView в ячейке табличного представления? - PullRequest
0 голосов
/ 18 мая 2018

enter image description here

У меня есть ячейка табличного представления, как на картинке выше.Я делаю заявление для арендатора в квартире, чтобы сообщить о дефекте помещения.если дефект был устранен, данные с сервера выдадут defect.status == 2 (если дефект.status == 1, процесс еще подлежит ремонту), тогда я покажу комментарий / ответ пользователя, удовлетворены они или нет,после того, как они ответят, нажмите YES или NO.UIView должен быть удален, я имею в виду UIView, который содержит ярлык «Вы удовлетворены» и кнопку «Да, нет», как показано ниже, и больше не появляются

enter image description here

Iиспользуйте приведенный ниже код в cellForRow в методе IndexPath

if dataDefect.status == 2 {
   cell.commentResponseView.removeFromSuperview()
}

enter image description here но я обнаружил ошибку nil

вот мой код в контроллере представления:

extension RequestDefectVC : UITableViewDataSource {

     //MARK: Table View Delegate & Datasource

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listDefects.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "defectCell", for: indexPath) as! RequestDefectCell

        let dataDefect = listDefects[indexPath.row]
        cell.defectData = dataDefect

        if dataDefect.status == 3 {
            cell.commentResponseView.removeFromSuperview()
        }

        // to implement button delegate on RequestDefectCell Delegate
        cell.cellYesButtonDelegate = self
        cell.cellNoButtonDelegate = self
        cell.tag = indexPath.row

        return cell
    }

}

и вот код в моей ячейке табличного представления:

protocol RequestDefectCellYesButtonDelegate : class {
    func yesButtonDidPressed(defectID: Int)
}

protocol RequestDefectCellNoButtonDelegate : class {
    func noButtonDidPressed(defectID: Int)
}

class RequestDefectCell: UITableViewCell {

    @IBOutlet weak var defectImageView: DesignableImageView!
    @IBOutlet weak var defectStatusLabel: UILabel!
    @IBOutlet weak var defectCreationDateLabel: UILabel!
    @IBOutlet weak var unitLabel: UILabel!
    @IBOutlet weak var defectDescriptionLabel: UILabel!
    @IBOutlet weak var commentResponseView: UIView!
    @IBOutlet weak var defectStatusLogo: UIImageView!

    weak var cellYesButtonDelegate: RequestDefectCellYesButtonDelegate?
    weak var cellNoButtonDelegate: RequestDefectCellNoButtonDelegate?



    @IBAction func yesButtonDidPressed(_ sender: Any) {
        guard let defectData = defectData else {return}
        cellYesButtonDelegate?.yesButtonDidPressed(defectID: defectData.defectID)
    }


    @IBAction func noButtonDidPressed(_ sender: Any) {
         guard let defectData = defectData else {return}
        cellNoButtonDelegate?.noButtonDidPressed(defectID: defectData.defectID)
    }





}

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

 @IBOutlet weak var commentResponseView: UIView!

но если я не подключусь, у меня не будет никакой другой идеи

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

попробуйте этот код

Цель c

[[cell. commentResponseView viewWithTag:MY_CUSTOM_TAG]removeFromSuperview] ;

swift

cell.commentResponseView.viewWithTag(MY_CUSTOM_TAG)?.removeFromSuperview()

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

0 голосов
/ 18 мая 2018

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

   if dataDefect.status == 3 {
          if let wantToRemoveView = cell.commentResponseView{
                 wantToRemoveView.removeFromSuperview()// OR wantToRemoveView.isHidden = true
                }
            }
0 голосов
/ 18 мая 2018

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

Поскольку для UITableView, если вы вызвали reloadData или любой другой метод, который вызывает ваш метод cellForRowAt indexPath, он найдет nil для этого представления, поскольку он уже удален в предыдущей итерацииcellForRowAt indexPath.

Таким образом, одним из решений является проверка того, удалено ли уже ваше представление в методе cellForRowAt indexPath или нет, как показано ниже:

if dataDefect.status == 3 && cell.commentResponseView != nil {
    cell.commentResponseView.removeFromSuperview()
}

Другое решение - установить ограничения таким образомв котором, если вы установите ограничение высоты commentResponseView на 0, что скрывает его от вашего UITableViewCell, а затем при определенных условиях установите его на 0 в вашем cellForRowAt indexPath вместо удаления этого представления из UITableViewCell.Таким образом, остальные виды будут управляться автоматически.

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