Не находит невидимую ячейку в collectionView

uicollectionview
swift

#1

В моем ViewController есть collectionView с двумя ячейками, в одной находится карта, а во второй описание маршрута(таймер, пройденное расстояние и средний темп передвижения), а так же кнопка pauseButton (во ViewController ). Cell имеют размер экрана, т.е. они скролятся, и на экране видно только одну ячейку.

По нажатию на кнопку pauseButtonAction я хочу, чтобы в обоих ячейках выполнялось locationManager.stopUpdatingLocation() . Он выполняется только в той ячейке, которая видна на экране, вторую он не видит.

tableView.cellForItem(indexPath) не помогает, tableView.visibleCells так же очевидно не работает.

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 2
    }

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let runCell = collectionView.dequeueReusableCell(withReuseIdentifier: "RunCollectionViewCell", for: indexPath) as! RunCollectionViewCell
        let mapCell = collectionView.dequeueReusableCell(withReuseIdentifier: "MapCollectionViewCell", for: indexPath) as! MapCollectionViewCell
        if indexPath.item == 0 && indexPath.section == 0 {
             return mapCell
        } else {
             return runCell
        }
    ///////////////
    @IBAction func pauseButtonAction(_ sender: Any) {
        let indexPathRunCell = IndexPath(item: 1, section: 0)
        let indexPathMapCell = IndexPath(item: 0, section: 0)
        if let mapCell = collectionView.cellForItem(at: indexPathMapCell) as? MapCollectionViewCell {
            print("MapCell найдена")
            mapCell.locationManager.stopUpdatingLocation()
        } else {
            print ("mapCell не найдена")
        }
        if let runCell = collectionView.cellForItem(at: indexPathRunCell) as? RunCollectionViewCell {
            print("runCell найдена")
            runCell.locationManager.stopUpdatingLocation()
            runCell.didTapPauseButton()
        } else {
            print("runCell не найдена")

    }

#2

Ну врядли бы несколько сотен разработчиков свифта делали что-то, что не работало бы.
У вас скорее всего все банально, вторая ячейка просто не загрузилась и поэтому доступа к ней нету.
Посмотрите как работает гугл карта, может вам аткой вариант больше подойдет? Там вся карта на весь экран, а что-то дополнительное находится во вьюшке, которая снизу свайпится.

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


#3

Они скролятся у меня горизонтально. При загрузке первой ячейки я сделал автоматический скролл на вторую ячейку. Т.е. они обе загружаются. Но когда я нажимаю на кнопку при видимой runCell, на консоль выводит что mapCell не найдена. А если видимая ячейка mapCell, то наоборот.


#4


#5

для вашего случая можете явно сохранять ячейки в ViewController, может поможет)

   struct Weak<T: AnyObject & Hashable>: Hashable {
        weak var value: T?
    }

var cells = Set<Weak<UICollectionViewCell>>()

в collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
пропишите что-то вроде

cells.insert(.init(value: cell))

p.s. Не самая лучшая идея давать ячейкам столько власти

udp
При нажатии на кнопку, можете явно обратиться ко всем ячейкам


#6

Не надо так делать.
Проще уже тогда заменить collectionView на scrollView с pagingEnabled, эффект будет тот же и 2 вьюшки будут сразу загружены, что обеспечит доступ сразу к обеим.


#7

Ктож спорит :slight_smile:
20 символов)