Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未调用iOS 13 CollectionView委托方法_Ios_Swift_Uicollectionview_Ios13 - Fatal编程技术网

未调用iOS 13 CollectionView委托方法

未调用iOS 13 CollectionView委托方法,ios,swift,uicollectionview,ios13,Ios,Swift,Uicollectionview,Ios13,我们的应用程序中有这段代码,除iOS 13外,所有版本的iOS都运行良好。在iOS 12及以下版本中,调用cellForItemAt和willDisplayCell等委托方法时不会出现问题,但在iOS 13中,只调用numberOfSections,而不调用其他方法 我在iOS 13中查找了可能导致此问题的API更改,但没有找到任何更改。在iOS 13中,我是否错过了一些让它工作的东西 这是我的密码: class PhotoBrowserView: UIView, UICollectionVie

我们的应用程序中有这段代码,除iOS 13外,所有版本的iOS都运行良好。在iOS 12及以下版本中,调用cellForItemAt和willDisplayCell等委托方法时不会出现问题,但在iOS 13中,只调用numberOfSections,而不调用其他方法

我在iOS 13中查找了可能导致此问题的API更改,但没有找到任何更改。在iOS 13中,我是否错过了一些让它工作的东西

这是我的密码:

class PhotoBrowserView: UIView, UICollectionViewDelegateFlowLayout, UICollectionViewDelegate, UICollectionViewDataSource, UIScrollViewDelegate {

    var photos: [PhotoURL] = [PhotoURL]() {
        didSet {
            photoCollectionView.reloadData()
        }
    }


    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return self.bounds.size
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "photoCell", for: indexPath)
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {

        let cell = cell as! SimplePhotoCell
        cell.thumbnailButton.isUserInteractionEnabled = false
        cell.thumbnailPath = photos[indexPath.item].photoURL.absoluteString
    }

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

        return photos.count
    }

}

这就是我对照片的称呼:

class StoryView: ShowPageView, UIScrollViewDelegate {

    private let photosView: PhotoBrowserView = {
       return PhotoBrowserView()
    }()


    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)

        if self.traitCollection.horizontalSizeClass == .compact, viewModel.story.portraitPhotos.count > 0 {
            photosView.photos = viewModel.story.portraitPhotos
        } else {
            photosView.photos = viewModel.story.landscapePhotos
        }
    }
}

在以前版本的iOS
traitCollectionDidChange
中,将视图添加到视图层次结构时调用方法,在iOS 13中,UIKit在将视图添加到视图层次结构之前创建视图时设置视图的特征。因此,
traitCollectionDidChange
不会被调用,您的照片也不会被设置。如果照片未设置,则不会重新加载collectionView。

在以前版本的iOS中,将视图添加到视图层次结构时调用traitCollectionDidChange方法,而在iOS 13中,UIKit会在将视图添加到视图层次结构之前创建视图时设置视图的特征。因此,
traitCollectionDidChange
不会被调用,您的照片也不会被设置。如果未设置照片,则不会重新加载collectionView。

有关详细信息,请参阅。我将分享他的答案,并添加我自己的答案

如前所述,在iOS 13中,将视图添加到视图层次结构时,不会调用traitCollectionDidChange。它将在设备的后续旋转中调用。在iOS 13之前,在将视图添加到视图层次结构时调用traitCollectionDidChange

iOS 13中的此更改导致在任何旋转之前首次显示视图时,我的所有控件都左对齐。他们在iOS 13之前居中

通过以下操作之一修复代码:

  • 在viewDidLoad中调用您的特质设置方法(基本上是将traitCollectionDidChange主体的相关部分复制到一个新方法,然后您可以从viewDidLoad和traitCollectionDidChange中调用

  • 按照苹果的指导,将特征设置调用添加到以下方法之一:

    UIViewController.viewWillLayoutSubviews()

    UIView.layoutSubviews()

    UIViewController.viewDidLayoutSubviews()

  • 作为viewDidLoad方法中的最后一行,调用传递nil的现有方法,如下所示:

    viewDidLoad(){ . . . traitCollectionDidChange(无) }

  • 考虑记录为什么你会偏离iOS版本。否则有人会出现,删除你的添加,在旧的iOS版本中出现冗余。你可以考虑为这种变化创造技术债务:

    // TODO: When I quit supporting pre iOS 13, this conditional can be removed
    if #available(iOS 13, *) {
       <whatever solution you chose above>
    }
    
    //TODO:当我退出支持iOS 13之前版本时,可以删除此条件
    如果可用(iOS 13,*){
    }
    
    有关更多详细信息,请参阅。我将分享他的答案并添加我自己的答案

    如前所述,在iOS 13中,将视图添加到视图层次结构时不会调用traitCollectionDidChange。它将在设备的后续旋转时调用。在iOS 13之前,将视图添加到视图层次结构时调用traitCollectionDidChange

    iOS 13中的此更改导致在任何旋转之前首次显示视图时,我的所有控件都左对齐。它们在iOS 13之前居中

    通过以下操作之一修复代码:

  • 在viewDidLoad中调用您的特质设置方法(基本上是将traitCollectionDidChange主体的相关部分复制到一个新方法,然后您可以从viewDidLoad和traitCollectionDidChange中调用

  • 按照苹果的指导,将特征设置调用添加到以下方法之一:

    UIViewController.viewWillLayoutSubviews()

    UIView.layoutSubviews()

    UIViewController.viewDidLayoutSubviews()

  • 作为viewDidLoad方法中的最后一行,调用传递nil的现有方法,如下所示:

    viewDidLoad(){ . . . traitCollectionDidChange(无) }

  • 考虑记录为什么你会偏离iOS版本。否则有人会出现,删除你的添加,在旧的iOS版本中出现冗余。你可以考虑为这种变化创造技术债务:

    // TODO: When I quit supporting pre iOS 13, this conditional can be removed
    if #available(iOS 13, *) {
       <whatever solution you chose above>
    }
    
    //TODO:当我退出支持iOS 13之前版本时,可以删除此条件
    如果可用(iOS 13,*){
    }
    
    你如何设置你的
    var照片
    ?你的照片
    didset
    是否被呼叫?@valosip我已经添加了该代码你如何设置你的
    var照片
    ?你的照片
    didset
    是否被呼叫?@valosip我已经添加了该代码