Странное поведение настройки tableView высоты строки и scrollPosition Swift - PullRequest
0 голосов
/ 12 апреля 2019

В том же viewController у меня есть calendarTableView, которые представляют дни месяца. На cellForRowAt я выбираю строку, соответствующую текущему дню, и вызываю функцию для заполнения timeSlotCollectionView. Все это работает, но у меня немного странная ситуация.

Случай 1: строка height = авто и scrollPosition.none = timeSlotCollectionView не следуют cornerRadius

Case2: строка height = авто и scrollPosition.middle = поток 1: EXC_BAD_ACCESS (код = 2, адрес = 0x659ef4) в calendarTableView определение ячейки

Case3: строка height = 44 и scrollPosition.none = calendarTableView ячейка не следует cornerRadius

Случай 4: строка height = 44 и scrollPosition.middle = calendarTableView ячейка не следует cornerRadius

Случай 5: строка heigh t = 60 и scrollPosition.none = calendarTableView ячейка ДОЛЖНА следовать cornerRadius

Случай 6: строка height = 60 и scrollPosition.middle = calendarTableView ячейка НЕ ​​повторяет cornerRadius снова ..

Я бы не стал возражать против высоты строки 60, но scrollPosition должен быть m.mddle, иначе я бы не увидел строку текущего дня ..

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

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

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

        // Configure the cell...

        let date = datesArray[indexPath.row]
        print(date)

        let calendar = Calendar.current
        let components = calendar.dateComponents([.year, .month, .day, .weekday], from: date)

        cell.dayLabel.text = "\(String(describing: components.day!))" + " " + "\(dayNamesArray[components.weekday! - 1])"
        cell.cellWeekday = components.weekday!
        print("cell weekday is: \(cell.cellWeekday!)") // prints correct weekday

        cell.cellId = "\(String(format:"%04d", components.year!))" + "\(String(format:"%02d", components.month!))" + "\(String(format:"%02d", components.day!))"
        self.selectedDate = cell.cellId // used for time slots cellId
        print("##################### selectedDate in tableview is :\(self.selectedDate) ")

        // highlighting current day cell
        if indexPath.row == self.actualDay - 1 && self.actualMonth == self.displayedMonth {

            cell.dayLabel.backgroundColor = UIColor.red.withAlphaComponent(0.3)

            // emulate user selecting the cell
            tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none) // changing to .middle makes the tableview go looping
            print(" @@@@@@@@@@@@@@@@@@@@@@@@@@   selected cell weekday is: \(cell.cellWeekday!) @@@@@@@@@@@@@@@@@@@@ ")
//            self.updateTimeSlots(selectedCell: cell)
//            self.actualWeekday = cell.cellWeekday! // nil error
            self.selectedDate = cell.cellId
//            calculateOpenTimeSlots()

        }
//        let cornerRadius: CGFloat = 5
//        cell.layer.cornerRadius = cornerRadius
//        cell.clipsToBounds = true
//        self.updateTimeSlots(selectedCell: cell)
        return cell

    }

1 Ответ

0 голосов
/ 13 апреля 2019

Я решил не выбирать сегодняшнюю row, а только прокрутить calendarTableView, чтобы иметь вместо этого среднее положение.Я также объявляю row height непосредственно в heightForRowAt.calendarTableView теперь ведет себя так, как ожидалось, и ячейка не выделяется напрямую, а подсвечивается, как я на самом деле хотел.Я надеюсь, что это поможет другим.Последняя функция:

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "calendarCell", for: indexPath) as! CalendarTableViewCell
        let cornerRadius: CGFloat = 5
        cell.layer.backgroundColor = UIColor.white.cgColor
        cell.layer.cornerRadius = cornerRadius
        cell.clipsToBounds = true
        cell.dayLabel.textColor = UIColor.white
        cell.dayLabel.layer.backgroundColor = UIColor.blue.withAlphaComponent(0.3).cgColor
        cell.dayLabel.layer.cornerRadius = cornerRadius
        cell.dayLabel.clipsToBounds = true
        // Configure the cell...

        let date = datesArray[indexPath.row]
        print(date)

        let calendar = Calendar.current
        let components = calendar.dateComponents([.year, .month, .day, .weekday], from: date)

        cell.dayLabel.text = "\(String(describing: components.day!))" + " " + "\(dayNamesArray[components.weekday! - 1])"
        cell.cellWeekday = components.weekday!
        print("cell weekday is: \(cell.cellWeekday!)") // prints correct weekday

        cell.cellId = "\(String(format:"%04d", components.year!))" + "\(String(format:"%02d", components.month!))" + "\(String(format:"%02d", components.day!))"
        self.selectedDate = cell.cellId // used for time slots cellId
        print("##################### selectedDate in tableview is :\(self.selectedDate) ")

        // highlighting current day cell
        if indexPath.row == self.actualDay - 1 && self.actualMonth == self.displayedMonth {

//            cell.layer.backgroundColor = UIColor.red.withAlphaComponent(0.3).cgColor
            cell.dayLabel.layer.backgroundColor = UIColor.red.withAlphaComponent(0.3).cgColor

            // emulate user selecting the cell
//            tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.middle)
            tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.middle, animated: true)
            print(" @@@@@@@@@@@@@@@@@@@@@@@@@@   selected cell weekday is: \(cell.cellWeekday!) @@@@@@@@@@@@@@@@@@@@ ")
            self.updateTimeSlots(selectedCell: cell)
//            self.actualWeekday = cell.cellWeekday! // nil error
            self.selectedDate = cell.cellId

        }

        return cell

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