UICollectionViewとUICollectionViewCellがXIBファイルにある場合、サブビューはnilです。

J. Doe

こんにちは!問題を正確に示すサンプルプロジェクトを作成しました。クリックしてダウンロード!

のサブクラスを含むアプリを作成しましたUICollectionViewCellこれにはImageViewasサブビューが含まれています。また、ビューを含むXIBファイルもあります。

直接埋め込まれているUICollectionViewCell内でこれを使用UICollectionViewするViewControllerと、セルは正常に機能します。セルを登録するコードを含むWorkingViewControllerのコードは次のとおりです。

class WorkingViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
  @IBOutlet weak var collectionView: UICollectionView!

  override func viewDidLoad() {
    super.viewDidLoad()

    let cellNib = UINib(nibName: "ImageCell", bundle: nil)
    collectionView.register(cellNib, forCellWithReuseIdentifier: "ImageCell")

    collectionView.reloadData()
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }

  func randomInt(min: Int, max: Int) -> Int {
    return Int(arc4random_uniform(UInt32(max - min + 1))) + min
  }

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

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

  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCell", for: indexPath) as? ImageCell else {
      fatalError("Could not load cell")
    }

    let randomNumber = randomInt(min: 1, max: 10)
    cell.imageView.image = UIImage(named: "stockphoto\(randomNumber)")

    return cell
  }
}

次に、ストーリーボードのエントリポイントBuggyViewControllerに移動します。ここでは、UICollectionViewは直接埋め込まれていません。が含まれUIViewていXIBます。これがそのビューのコードで、以前のセルの登録が含まれています。

class DetailView: UIView, UICollectionViewDelegate, UICollectionViewDataSource {
  @IBOutlet var contentView: UIView!
  @IBOutlet weak var collectionView: UICollectionView!

  override init(frame: CGRect) {
    super.init(frame: frame)

    setup()
  }

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    setup()
  }

  private func setup() {
    Bundle.main.loadNibNamed("DetailView", owner: self, options: nil)

    self.addSubview(self.contentView)
    self.contentView.frame = self.bounds
    self.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    collectionView.delegate = self
    collectionView.dataSource = self

    let cellNib = UINib(nibName: "ImageCell", bundle: nil)
    collectionView.register(cellNib, forCellWithReuseIdentifier: "ImageCell")
    collectionView.register(ImageCell.self, forCellWithReuseIdentifier: "ImageCell")

    collectionView.reloadData()
  }

  func randomInt(min: Int, max: Int) -> Int {
    return Int(arc4random_uniform(UInt32(max - min + 1))) + min
  }

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

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

  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCell", for: indexPath) as? ImageCell else {
      fatalError("Could not load cell")
    }

    let randomNumber = randomInt(min: 1, max: 10)
    cell.imageView.image = UIImage(named: "stockphoto\(randomNumber)")

    return cell
  }
}

ただし、これにより、DetailViewの55行目にエラーが発生します。

スレッド1:致命的なエラー:オプション値のアンラップ中に予期せずnilが見つかりました

したがって、ここimageViewではセルのが突然nilになり、セルの登録またはインスタンス化で何か間違ったことをしたと思います。しかし、私はそれを解決することはできません。

オクニディー

セルクラスを登録する行を削除する必要があります。

collectionView.register(ImageCell.self, forCellWithReuseIdentifier: "ImageCell")

実際、セルをペン先で定義したので、メソッドを使用してセルを登録する必要がありますfunc register(_ nib: UINib?, forCellWithReuseIdentifier identifier: String)cellClassメソッドを介して登録すると、nilが返されます。

そして、Appleのドキュメントが述べているように:

以前に同じ再利用識別子でクラスまたはnibファイルを登録した場合は、cellClassパラメーターで指定したクラスが古いエントリを置き換えます。指定された再利用識別子からクラスの登録を解除する場合は、cellClassにnilを指定できます。

これはあなたがゼロになった理由を説明しています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ビューと同じファイルにある場合、コントローラーは未定義です

分類Dev

サブモジュールに共通の親ディレクトリがある場合、サブモジュールから.gitファイルを削除するにはどうすればよいですか?

分類Dev

同じファイル内にある場合、ディレクティブのAngularjsサービスは不明です

分類Dev

UICVレイアウトが無効になっている場合、UICollectionViewCellはサブビューのリレーアウトに失敗します

分類Dev

サブビューのサイズがスーパービューと同じである場合、ctrl-dragを使用してIBに制約を設定するにはどうすればよいですか?

分類Dev

XIBファイルから別のXibファイルへのサブビューとしてUIViewを追加する方法

分類Dev

Windows ユニバーサル アプリ - Javascript - ファイル IO - ファイルがすでに存在する場合はクラッシュする

分類Dev

「既に存在するファイルを作成することはできませんが。」のトラブルシューティング方法 IIS Express appcmdを使用してサイトを作成する場合はどうなりますか?

分類Dev

XIBファイルを使用して作成されたカスタムUICollectionViewCellがあります。このセルをタップしたときに別のコントローラーをスタックにプッシュするにはどうすればよいですか。

分類Dev

ファイルに改行のあるデータまたは改行のないデータを含めることができる場合は、csvデータをプレビューします

分類Dev

Xcode警告:ビルドフェーズにこのファイルがある場合、ファイルを処理するルールはありませんか?

分類Dev

ツリー全体でファイルを削除しますが、名前付きサブフォルダーにある場合に限ります

分類Dev

Vimeoで、ビデオがライブストリーミングでない場合、「HTTPライブストリーミング」ビデオファイルリンクを使用することは意味がありますか?

分類Dev

xibファイルのビューとトップレイアウトガイドの間に制約を追加する方法はありますか?

分類Dev

テストファイルが別のモジュールにある場合、Pythonはテストを見つけることができません

分類Dev

一致するファイルが上位レベルに存在する場合、検索コマンドはサブフォルダー内のファイルを見つけることができません

分類Dev

C#のツリービューデータがファイルシステムで提供されている場合、サーバーシステムファイルまたはローカルシステムファイルが表示されますか?

分類Dev

Webpack と Babel で「このファイル タイプを処理するには、適切なローダーが必要になる場合があります」

分類Dev

UICollectionViewをスクロールすると、セルのサブビューフレームが変更されるのはなぜですか

分類Dev

サイトにロケールを決定するためのサブパスがある場合、apple-app-site-associationファイルにパスを追加するにはどうすればよいですか?

分類Dev

サイトにロケールを決定するためのサブパスがある場合、apple-app-site-associationファイルにパスを追加するにはどうすればよいですか?

分類Dev

ソリューションファイルが置き忘れられ、ソリューションファイルのバックアップがない場合、ビルドファイルをasp.netのソリューションファイルに変更する方法/ツールはありますか?

分類Dev

ファイルが変更された場合にのみ、Teamcity でビルドをトリガーする方法はありますか?

分類Dev

PrintWriterがファイルを作成することがあるのに、他の場合はファイルを作成しないのはなぜですか?

分類Dev

フレームモディファイアがnilイメージにアタッチされている場合でも、他のビューに影響を与えるのはなぜですか?

分類Dev

CPackを使用してOSXでビルドする場合、パッケージ/バンドルのファイル名にDarwinというサフィックスが付くのを避けるにはどうすればよいですか?

分類Dev

.NETは、ファイルが別のサーバーにある場合に1つのZipファイルをダウンロードします

分類Dev

既存のjarファイルとソースコードがある場合、コードを変更するにはどうすればよいですか?

分類Dev

NIB / XIBファイルでビューのサイズを設定します

Related 関連記事

  1. 1

    ビューと同じファイルにある場合、コントローラーは未定義です

  2. 2

    サブモジュールに共通の親ディレクトリがある場合、サブモジュールから.gitファイルを削除するにはどうすればよいですか?

  3. 3

    同じファイル内にある場合、ディレクティブのAngularjsサービスは不明です

  4. 4

    UICVレイアウトが無効になっている場合、UICollectionViewCellはサブビューのリレーアウトに失敗します

  5. 5

    サブビューのサイズがスーパービューと同じである場合、ctrl-dragを使用してIBに制約を設定するにはどうすればよいですか?

  6. 6

    XIBファイルから別のXibファイルへのサブビューとしてUIViewを追加する方法

  7. 7

    Windows ユニバーサル アプリ - Javascript - ファイル IO - ファイルがすでに存在する場合はクラッシュする

  8. 8

    「既に存在するファイルを作成することはできませんが。」のトラブルシューティング方法 IIS Express appcmdを使用してサイトを作成する場合はどうなりますか?

  9. 9

    XIBファイルを使用して作成されたカスタムUICollectionViewCellがあります。このセルをタップしたときに別のコントローラーをスタックにプッシュするにはどうすればよいですか。

  10. 10

    ファイルに改行のあるデータまたは改行のないデータを含めることができる場合は、csvデータをプレビューします

  11. 11

    Xcode警告:ビルドフェーズにこのファイルがある場合、ファイルを処理するルールはありませんか?

  12. 12

    ツリー全体でファイルを削除しますが、名前付きサブフォルダーにある場合に限ります

  13. 13

    Vimeoで、ビデオがライブストリーミングでない場合、「HTTPライブストリーミング」ビデオファイルリンクを使用することは意味がありますか?

  14. 14

    xibファイルのビューとトップレイアウトガイドの間に制約を追加する方法はありますか?

  15. 15

    テストファイルが別のモジュールにある場合、Pythonはテストを見つけることができません

  16. 16

    一致するファイルが上位レベルに存在する場合、検索コマンドはサブフォルダー内のファイルを見つけることができません

  17. 17

    C#のツリービューデータがファイルシステムで提供されている場合、サーバーシステムファイルまたはローカルシステムファイルが表示されますか?

  18. 18

    Webpack と Babel で「このファイル タイプを処理するには、適切なローダーが必要になる場合があります」

  19. 19

    UICollectionViewをスクロールすると、セルのサブビューフレームが変更されるのはなぜですか

  20. 20

    サイトにロケールを決定するためのサブパスがある場合、apple-app-site-associationファイルにパスを追加するにはどうすればよいですか?

  21. 21

    サイトにロケールを決定するためのサブパスがある場合、apple-app-site-associationファイルにパスを追加するにはどうすればよいですか?

  22. 22

    ソリューションファイルが置き忘れられ、ソリューションファイルのバックアップがない場合、ビルドファイルをasp.netのソリューションファイルに変更する方法/ツールはありますか?

  23. 23

    ファイルが変更された場合にのみ、Teamcity でビルドをトリガーする方法はありますか?

  24. 24

    PrintWriterがファイルを作成することがあるのに、他の場合はファイルを作成しないのはなぜですか?

  25. 25

    フレームモディファイアがnilイメージにアタッチされている場合でも、他のビューに影響を与えるのはなぜですか?

  26. 26

    CPackを使用してOSXでビルドする場合、パッケージ/バンドルのファイル名にDarwinというサフィックスが付くのを避けるにはどうすればよいですか?

  27. 27

    .NETは、ファイルが別のサーバーにある場合に1つのZipファイルをダウンロードします

  28. 28

    既存のjarファイルとソースコードがある場合、コードを変更するにはどうすればよいですか?

  29. 29

    NIB / XIBファイルでビューのサイズを設定します

ホットタグ

アーカイブ