【问题标题】:RXSwift collectionView.indexPathsForVisibleItems is emptyRXSwift collectionView.indexPathsForVisibleItems 为空
【发布时间】:2021-11-12 13:14:11
【问题描述】:

我是 RXSwift 的新手。所以基本上我只想在我的collectionView中看到最后一个单元格时才向右移动,但是 visibleIndexPaths 总是返回一个空列表,如果我尝试在 #1 处获取 visibleIndexPaths 它将工作正常,但在 #2 处不工作

一个可能的原因是,在我更新数据源后,collectionView 被告知要重新加载数据,然后我试图在加载完成之前获取 visibleIndexPaths?

ViewController部分代码

class PerfectDayDiaryPopUpContentViewController: UIViewController {

    @IBOutlet weak var textView: UITextView!
    @IBOutlet weak var imageCollectionView: UICollectionView!
    private var viewModel: PerfectDayDiaryPopUpContentViewModel 
    private let disposeBag = DisposeBag()

    func bind() {
        self.viewModel.dataSource
            .bind(to: self.imageCollectionView.rx.items) { (collectionView, row, image) -> UICollectionViewCell in
                // #1 wroking well
                print(self.imageCollectionView.indexPathsForVisibleItems)
                return self.renderCell(collectionView: collectionView, row: row, image: image)
            }
            .disposed(by: self.disposeBag)

        self.viewModel.dataSource
            .subscribe { [weak self] images in
                
                if self != nil, let images = images.element {
                    
                    let lastImageIndexPath = IndexPath(row: images.count - 1, section: 0)                  
                    // #2 not working
                    let visibleIndexPaths = self!.imageCollectionView.indexPathsForVisibleItems
                    let shouldMoveToRight = visibleIndexPaths.contains(lastImageIndexPath)
                    
                    if shouldMoveToRight {
                        self!.imageCollectionView.scrollToItem(at: lastImageIndexPath, at: .left, animated: true)
                    }
                    
                }
                
               
            }
            .disposed(by: self.disposeBag)

    }
        
}

删除按钮动作绑定部分代码

  cell.deleteButton.rx
      .controlEvent(.touchUpInside)
      .bind {
           self.viewModel.lastImages = self.viewModel.images.value
           var images = self.viewModel.images.value
           images.remove(element: image)
           self.viewModel.images.accept(images)
           self.viewModel.upateDataSource()
           self.imageCollectionView.layoutIfNeeded()

                    
          }
          .disposed(by: self.disposeBag)

视图模型

class PerfectDayDiaryPopUpContentViewModel: NewPopUpContentViewModel {

    
    public let content: BehaviorRelay<String>
    public let images: BehaviorRelay<[UIImage]>
    public let dataSource: BehaviorRelay<[UIImage]>
    public let addImageIdentifier: String = "AddNewImage"
    public let addImage = UIImage(named: "AddImage-HD")!
    public var lastImages: [UIImage] = []
    
    private let dataManager = DiaryDataManager()
    private let disposeBag = DisposeBag()
   
    init() {
        self.addImage.accessibilityIdentifier = self.addImageIdentifier
        self.content = BehaviorRelay<String>(value: "")
        self.images = BehaviorRelay<[UIImage]>(value: [UIImage]())
        self.dataSource = BehaviorRelay<[UIImage]>(value: [self.addImage])
    }
    
    init(diary: Diary) {
        self.addImage.accessibilityIdentifier = self.addImageIdentifier
        self.content = BehaviorRelay<String>(value: diary.getContent())
        self.images = BehaviorRelay<[UIImage]>(value: diary.getImages())
        self.dataSource = BehaviorRelay<[UIImage]>(value: [self.addImage])


    }
    
    public func upateDataSource() {
        let images = self.images.value
        if images.count < 8 {
            self.addImage.accessibilityIdentifier = self.addImageIdentifier
            self.dataSource.accept(images + [self.addImage])
        } else {
            self.dataSource.accept(images)
        }

    }
    
    
    public func saveDiary() {

        self.dataManager.saveDiary(date: CustomDate.current, content: self.content.value, images: self.images.value)
    }
    
    
    
    
}

【问题讨论】:

    标签: ios swift uikit rx-swift collectionview


    【解决方案1】:

    好的,我想通了,这个问题与 RXswift 无关

    我刚刚添加了 layoutIfNeeded() 并且它起作用了

     self.viewModel.dataSource
                .subscribe { [weak self] images in
                    UIView.animate(withDuration: 0.3) {
                        self?.imageCollectionView.layoutIfNeeded()
                    }
                    if self != nil, let images = images.element {
                        
                        let lastImageIndexPath = IndexPath(row: images.count - 1, section: 0)                  
                        // #2 not working
                        let visibleIndexPaths = self!.imageCollectionView.indexPathsForVisibleItems
                        let shouldMoveToRight = visibleIndexPaths.contains(lastImageIndexPath)
                        
                        if shouldMoveToRight {
                            self!.imageCollectionView.scrollToItem(at: lastImageIndexPath, at: .left, animated: true)
                        }
                        
                    }
                    
                   
                }
                .disposed(by: self.disposeBag)
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多