1. ホーム
  2. ios

[解決済み] Fatal error: optional values のアンラップ時に予期せず nil が見つかった [duplicate] 。

2022-07-20 01:43:58

質問

を使っていたのですが UICollectionView を使用していましたが、セルのラベルのテキストを変更しようとすると表示されます。

    func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int
{
    return 5
}

func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell!
{
    var cell = collectionView.dequeueReusableCellWithReuseIdentifier("title", forIndexPath: indexPath) as TitleCollectionViewCell
    // Next line: fatal error: unexpectedly found nil while unwrapping an Optional value
    cell.labelTitle.text = "This is a title"
    return cell
}

どなたかご存じないですか?

どのように解決するのですか?

ほぼ間違いなく、あなたの再利用識別子 "title" は正しくありません。

からわかるように UITableView.h メソッドのシグネチャを見ると dequeueReusableCellWithIdentifier で、戻り値の型は 暗黙のうちにアンラップされたオプショナルなもの :

func dequeueReusableCellWithIdentifier(identifier: String!) -> AnyObject! // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.

の後にあるエクスクラメーションマークで判断します。 AnyObject :

    AnyObject!

では、まず最初に考えるべきことは、「暗黙のうちにアンラップされたオプション(Implicitly Unwraped Optional)」とは何か、ということです。

Swift プログラミング言語 は教えてくれる。

プログラムの構造から、オプショナルが最初に設定された後、常に値を持つことが明らかな場合があります。 常に値を持つことがプログラムの構造から明らかな場合があります。このような場合 にアクセスするたびにオプショナルの値を確認し、ラップを解除する必要性をなくすことが有用です。 というのも、このオプションは常に値を持つものと考えてよいからです。 を持つと安全に仮定できるからです。

このような種類のオプショナルは暗黙のうちにアンラップされるオプショナルとして定義されます。 オプショナルと定義されています。暗黙のうちにアンラップされたオプショナルを書くには、オプショナルの後ろにクエスチョンマーク(String? の後にクエスチョンマーク(String?)ではなく、感嘆符(String!)を置くことで記述します。 を付けることで記述します。

つまり、基本的には、ある時点でnilであったかもしれないものが、ある時点から再びnilになることはないのです。したがって、ラップされていない値としてそれを取ることによって、私たちはいくつかの手間を省くことができます。

この場合 dequeueReusableCellWithIdentifier がそのような値を返すことは理にかなっています。与えられた識別子 は、再利用のためにセルを登録するために既に使用されていなければなりません。 不正な識別子を指定すると、デキューはそれを見つけることができず、ランタイムは決して発生しないはずのnilを返します。これは致命的なエラーで、アプリはクラッシュし、コンソールの出力には次のように表示されます。

fatal error: unexpectedly found nil while unwrapping an Optional value

結論: .storyboard、Xib、またはコードで指定されたセルの再利用識別子を確認し、キューを解除するときにそれが正しいことを確認します。