ручной запуск didSelectRowAtIndexPath в cellForRowAt приводит к нулевой ячейке в фактическом методе делегата didSelectRowAtIndexPath - PullRequest
0 голосов
/ 11 апреля 2019

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

Вы видите, правильно ли я выполняю вызов didSelectRowAtIndexPath? Большое спасибо как всегда. Это функции:

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "bookingCell", for: indexPath) as! BookingTableViewCell
        let booking = self.fetchedResultController?.object(at: indexPath)
        // Configure the cell...

        cell.cellId = booking!.bookingId

        cell.bookingId = booking!.bookingId
        print(booking!.bookingId)
        cell.bookingIdInfoLabel.text = booking!.bookingId

        cell.bookingDate = booking!.bookingDate
        cell.bookingDateInfoLabel.text = booking?.bookingDate

        cell.bookingStart = booking!.bookingStart
        cell.bookingStartInfoLabel.text = booking?.bookingStart

        cell.bookingEnd = booking!.bookingEnd
        cell.bookingEndInfoLabel.text = booking?.bookingEnd

        cell.bookingPrice = booking!.bookingPrice
        cell.worksDescription = booking!.worksList

        cell.customerName = booking!.customerName
        cell.customerNameInfoLabel.text = booking?.customerName

        cell.cellView.layer.cornerRadius = cornerRadius
        cell.cellView.clipsToBounds = true

        cell.bookingIdInfoLabel.layer.cornerRadius = cornerRadius
        cell.bookingIdInfoLabel.clipsToBounds = true

        cell.bookingDateInfoLabel.layer.cornerRadius = cornerRadius
        cell.bookingDateInfoLabel.clipsToBounds = true

        cell.bookingStartInfoLabel.layer.cornerRadius = cornerRadius
        cell.bookingStartInfoLabel.clipsToBounds = true

        cell.bookingEndInfoLabel.layer.cornerRadius = cornerRadius
        cell.bookingEndInfoLabel.clipsToBounds = true

        cell.customerNameInfoLabel.layer.cornerRadius = cornerRadius
        cell.customerNameInfoLabel.clipsToBounds = true

        // set the corresponding row for the selected time slot's booking as selected
        if cell.cellId == self.bookingId {
            tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.middle) // select timeslot's corresponding row
            self.tableView(self.bookingTableView, didSelectRowAt: indexPath)

        }
        return cell
    }


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath) as! BookingTableViewCell

        print("selected cell id is : \(cell.cellId!)")
        self.bookingIdInfoLabel.text = cell.bookingId
        self.bookingDateInfoLabel.text = cell.bookingDate
        self.bookingStartInfoLabel.text = cell.bookingStart
        self.bookingEndInfoLabel.text = cell.bookingEnd
        self.priceInfoLabel.text = cell.bookingPrice
        self.customerInfoLabel.text = cell.customerName
        self.worksDescriptionInfoTextVIew.text = cell.worksDescription

    }

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Создайте новую функцию, в которой вы изменяете текст меток в зависимости от выбора бронирования

func updateSelection(_ selectedBooking: Booking) {
    print("selected cell id is : \(booking.bookingId!)")
    self.bookingIdInfoLabel.text = booking.bookingId
    self.bookingDateInfoLabel.text = booking.bookingDate
    self.bookingStartInfoLabel.text = booking.bookingStart
    self.bookingEndInfoLabel.text = booking.bookingEnd
    self.priceInfoLabel.text = booking.bookingPrice
    self.customerInfoLabel.text = booking.customerName
    self.worksDescriptionInfoTextVIew.text = booking.worksList
}

В didSelectRowAt вызовите этот метод следующим образом

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.updateSelection(self.fetchedResultController?.object(at: indexPath))
}

вызовите тот же метод в cellForRowAt

if booking!.bookingId == self.bookingId {
    self.updateSelection(self.fetchedResultController?.object(at: indexPath))
}
    return cell
}
0 голосов
/ 11 апреля 2019

Вот что я бы предложил

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "bookingCell", for: indexPath) as! BookingTableViewCell
    let booking = self.fetchedResultController?.object(at: indexPath)
    cell.config(booking:booking)
    if booking.bookingId == self.bookingId {
        self.performChanges(forBooking:booking)
    }
}


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath) as! BookingTableViewCell
    let booking = cell.booking
    self.performChanges(forBooking:booking)
}

func performChanges(booking:Booking) {
    //perform all the changes that you did in didSelectRow before
}

//Inside cell
var booking:Booking?
func config(booking:Booking) {
    self.booking = booking
    //set all the data and manipulate the ui here
}

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

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