2017-01-31 1 views
0

두 개의보기 컨트롤러가 있습니다. 첫 번째 뷰 컨트롤러는 사용자의 위치를 ​​가져오고 대리자 메서드를가집니다. 두 번째 뷰 컨트롤러는 첫 번째 VC의 델리게이트 메서드를 따릅니다. 델파이 메서드에서받은 위치를 표시하는 2 차 VC에 UILabel이 있습니다.UILabel은 nil 값을 제공합니다.

@IBOutlet var locationLabel: UILabel! 
func locationOfTheUser(location: String) { 
locationLabel.text=location 
} 

locationLabel은 참조 출구로 IB에 연결됩니다. 하지만 프로그램을 실행하면 옵션이 언 래핑되는 동안 예기치 않게 nil 값이 발견되었다는 오류가 발생합니다.

+0

대리인이 제대로 설정되어 있는지 확인하십시오. –

+0

이 함수를 호출 할 때 'func locationOfTheUser (location : String)'할 때 레이블이 초기화되었는지 확인하십시오. – John

+0

@ 존 미리 정의 된 값으로 IB에 라벨을 만들었습니다. 그래서 그것을 명시 적으로 초기화해야합니까? –

답변

0

이 같은 레이블을 선언해야합니다 :

@IBOutlet var weak locationLabel: UILabel! 

언급 "@IBOutlet는"인터페이스 빌더는 출구를 인식합니다.

대부분의 경우 콘센트의 소유자가보기의 소유자와 같지 않으므로 "약"이 사용됩니다. 예를 들어,보기 컨트롤러는 someLabel을 소유하지 않습니다.보기 컨트롤러의보기는 않습니다.

예를 들어, 슈퍼 뷰에서 콘센트를 제거하는 코드 경로가 있거나 콘센트가 스토리 보드에 (의도적으로) 연결되어 있지 않은 경우 콘센트가 거기에 있음을 보증하지 않으므로 옵션이어야합니다 액세스 할 때.

@IBOutlet var someLabel: UILabel? 

어떤 코드 경로가없는 경우이 제거됩니다 불필요 할 때 뷰 계층에 콘센트, 또한에 유지하지하기가 약한 만들기 위해 좋은 것입니다 다시는-추가 :

@IBOutlet weak var someLabel: UILabel? 

이렇게하면 슈퍼 뷰에서 레이블을 제거하면보기 컨트롤러에서 강력한 참조에 의해 메모리에 보관되지 않습니다. 콘센트는 경우에 약한되지 않습니다

@IBOutlet var someLabel: UILabel! 

코드는 지금까지이 변경됩니다 있도록 : 항상 강한 암시 풀어 선택이 적절하다있을 것 출구를가 가장 일반적인 경우에, 뷰 계층 구조에서보기를 제거하지만 속성의 옵션 성을 업데이트하는 것을 잊어 버리는 코드 경로. 개체가 메모리에 남아 있고 앱을 사용하더라도 앱이 다운되지 않습니다. 아울렛이기 때문에

또한, "VAR는"초기화

당신은 후 코드를 넣을 수 있습니다

후 설정, 정의, 사용됩니다

func locationOfTheUser(location: String) { 
    locationLabel.text=location 
} 
0
private var locationOfUser: String? 

    func locationOfTheUser(location: String) { 
     locationOfUser = location 
    } 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     locationLabel.text = locationOfUser 
    } 

이보십시오. 작동하는 경우,이 컨트롤러의보기가로드되기 전에 locationOfTheUser()가 호출되고 있음을 의미하므로 레이블이 아직 없습니다.

관련 문제