programing

치명적 오류: 선택적 값의 래핑을 해제하는 동안 예기치 않게 0이(가) 발견되었습니다.

lastmoon 2023. 7. 31. 21:49
반응형

치명적 오류: 선택적 값의 래핑을 해제하는 동안 예기치 않게 0이(가) 발견되었습니다.

는 제가사것은한용▁an것은을 사용하고 있었습니다.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
}

이 일에 대해 아는 사람?

Screenshot for warning on Console

안전하게 포장을 풀면 충돌을 방지할 수 있습니다.cell.labelTitleif let진술.

if let label = cell.labelTitle{
    label.text = "This is a title"
}

하지만 당신이 왜 0 값을 얻는지 알기 위해서는 디버깅을 좀 해야 할 것입니다.

식별자는 의확하게실재식, 의용별는자사거당신▁almost는입니다."title"틀렸습니다.

는 에서알수다니에서 알 수 있습니다.UITableView.h of 의메명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!

먼저 고려해야 할 것은 "암묵적으로 포장되지 않은 옵션"이란 무엇입니까?

스위프트 프로그래밍 언어는 우리에게 다음과 같은 것을 알려줍니다.

프로그램의 구조를 보면 해당 값이 처음 설정된 후 옵션에 항상 값이 있는 것이 분명할 수 있습니다.이러한 경우 옵션이 항상 값을 갖는 것으로 안전하게 가정할 수 있으므로 옵션에 액세스할 때마다 값을 확인하고 풀 필요가 없습니다.

이러한 종류의 옵션은 암묵적으로 포장되지 않은 옵션으로 정의됩니다.선택사항으로 만들려는 유형 뒤에 물음표(문자열?)가 아닌 느낌표(문자열!)를 붙여 암묵적으로 래핑 해제된 선택사항을 작성합니다.

그래서, 기본적으로, 어떤 것은 한 시점에서는 0이 될 수도 있었지만, 어떤 시점에서는 다시는 0이 되지 않습니다.그러므로 우리는 그것을 포장되지 않은 값으로 받아들임으로써 우리 자신의 수고를 덜어줍니다.

이 경우에는 다음과 같습니다.dequeueReusableCellWithIdentifier이러한 값을 반환합니다.제공된 식별자는 이미 셀을 다시 사용할 수 있도록 등록하는 사용되어 있어야 합니다.잘못된 식별자를 제공하면 디큐에서 찾을 수 없으며 런타임에서 절대 발생해서는 안 되는 0을 반환합니다.치명적인 오류입니다. 앱이 충돌하고 콘솔 출력이 다음을 제공합니다.

fatal error: unexpectedly found nil while unwrapping an Optional value

결론: .storyboard, Xib 또는 코드에 지정된 셀 재사용 식별자를 확인하고 대기열을 해제할 때 정확한지 확인합니다.

합니다.self.collectionView.registerClass(cellClass: AnyClass?, forCellWithReuseIdentifier identifier: String)그렇다면 해당 코드 행을 제거합니다.

자세한 내용은 다음 답변을 참조하십시오.UICollectionViewCell의 아울렛이 0인 이유는 무엇입니까?

"스토리보드를 사용하는 경우에는 이 이름을 부르고 싶지 않습니다.스토리보드에 있는 내용을 덮어쓸 것입니다."

버그인지 뭔지는 모르겠지만 당신이 커스텀 셀을 사용할 때 당신의 라벨과 다른 UI가 자동으로 초기화되지 않습니다.당신은 이것을 당신의 옷에서 시도해야 합니다.UICollectionViewController수업. 저한테는 효과가 있었어요.

override func viewDidLoad() {
    super.viewDidLoad()

    let nib = UINib(nibName: "<WhateverYourNibName>", bundle: nil)
    self.collectionView.registerNib(nib, forCellReuseIdentifier: "title")
}

줄 이 줄 바 기cell.labelTitle.text = "This is a title"
와 함께cell.labelTitle?.text = "This is a title"

액세스를 시도할 때 오류가 발생했습니다.UILabel하는 것을 잊었습니다.UILabelIBOutlet스토리보드에서 그리고 그것이 이 오류로 인해 앱이 중단되었습니다!!

저도 이 문제가 있었는데 뷰 컨트롤러에 문제가 있었습니다.당신의 애플리케이션이 어떻게 구성되어 있는지 잘 모르기 때문에, 제가 발견한 것에 대해 설명하겠습니다.나는 xcode와 coding에 꽤 익숙하지 않으니, 참고 있어요.

UI 레이블의 텍스트를 프로그래밍 방식으로 변경하려고 했습니다."self.mylabel.text"를 사용하는 것은 동일한 클래스에 해당 레이블을 포함하지 않는 다른 뷰 컨트롤러를 추가하기 전까지는 잘 작동했습니다.그 때 저는 당신이 보고 있는 오류를 얻었습니다.동일한 UI 레이블을 추가하고 추가 뷰 컨트롤러에 연결했을 때 오류가 사라졌습니다.

간단히 말해서 Swift에서는 동일한 클래스에 할당된 모든 뷰 컨트롤러가 해당 클래스에 있는 코드를 참조해야 합니다. 그렇지 않으면 오류가 발생합니다.코드가 다른 두 개의 보기 컨트롤러가 있는 경우 다른 클래스에 할당합니다.이것은 저에게 효과가 있었고 바라건대 당신이 하고 있는 일에 적용됩니다.

치명적 오류: 선택적 값의 래핑을 해제하는 동안 예기치 않게 0이(가) 발견되었습니다.

  1. IBOutlet 컬렉션을 확인하십시오. 이 오류로 인해 연결이 해제된 uielement 개체 사용이 발생할 수 있습니다.

:) 그것이 일부 어려움에 처한 사람들에게 도움이 되기를 바랍니다.

저는 이것에 대한 해결책을 직접 찾아다녔습니다.여기서 언급하신 것처럼 제 문제만 UITableViewCell Not UICollectionView와 관련이 있습니다.

우선, 저는 iOS 개발에 익숙하지 않습니다.새것처럼, 여기 앉아서 내 첫 번째 튜토리얼을 얻으려고 하니, 내 말을 어떤 것으로도 믿지 마.(작동하지 않는 한 ;)

에 대한 아무런 언급도 받지 못하고 있었습니다.cell.detailTextLabel.text제가 팔로우하고 있는 튜토리얼 비디오를 다시 본 후, 놓친 것이 없는 것처럼 보였습니다.그래서 저는 UITableViewCell의 헤더 파일을 입력했고 이것을 찾았습니다.

var detailTextLabel: UILabel! { get } // default is nil. label will be created if necessary (and the current style supports a detail label).

그래서 저는 (그리고 현재 스타일은 상세 레이블을 지원합니다)라고 쓰여 있는 것을 알아차렸습니다. 음, 사용자 지정 스타일에는 기본적으로 detailLabel이 없습니다. 그래서 저는 스토리보드에서 셀의 스타일을 바꾸기만 하면 되었고 모든 것이 정상이었습니다.

당신의 레이블을 부르는 것이 항상 거기에 있어야 한다고 생각합니까?

따라서 다음 코너의 조언이 기본적으로 해당 레이블을 사용할 수 있다면 사용하십시오.스타일이 올바르게 설정되어 있고 재사용 식별자가 스토리보드의 설정과 일치하는 경우, 두 개 이상의 사용자 지정 셀을 사용하지 않는 한 이 검사를 수행하지 않아도 됩니다.

Nil 병합 연산자도 사용할 수 있습니다.

rowName = rowName != nil ?rowName!.stringFromCamelCase():""

Xcode 7.3에서도 같은 문제가 있었습니다.제 해결책은 세포에 올바른 재사용 식별자가 있는지 확인하는 것이었습니다.테이블 보기 섹션에서 테이블 보기 셀을 프로그램에서 사용 중인 해당 식별자 이름으로 설정합니다.

저는 같은 문제를 겪고 있었고 그 이유는 UI 이미지를 잘못된 이름으로 로드하려고 했기 때문입니다.더블 체크.setImage(UIImage(named: "-name-"전화를 걸어 이름이 올바른지 확인합니다.

여기 메시지는 같지만 원인은 다릅니다.나는.UIBarButton세그를 밀어낸 것.segue에 식별자가 없습니다.

언급URL : https://stackoverflow.com/questions/24643522/fatal-error-unexpectedly-found-nil-while-unwrapping-an-optional-values

반응형