2015-01-09 4 views
0

현재 이벤트 목록을 보유하고있는 UITableView가 있습니다. 각 이벤트에는 사용자가 이벤트와 관련된 사진을 더 크게 볼 수있는 버튼이 있습니다. UIButton을 연결하고 설정했지만 새 창에서 이미지를 설정하는 데 어려움을 겪고 있습니다. 나는 응용 프로그램을 실행하면이미지 집합 UIImageView

func largeMap(sender: UIButton!) { 
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 
    let manager = NSFileManager.defaultManager() 
    self.performSegueWithIdentifier("largeMapView", sender: self) 
    println(sender.tag.description) 
    println(documentsPath+"/Flight"+(sender.tag.description)+"/Map.png") 
    if let image = UIImage(data: manager.contentsAtPath(documentsPath+"/Flight"+(sender.tag.description)+"/Map.png")!) { 
     largeMapView.image = image 
    } 
} 

, 그것은 largeMapView.image = 이미지에서 충돌이 날 수 있습니다 "치명적인 오류 : 예기치 않게하는 옵션 값을 풀기 동안 nil을 발견"여기 제 기능입니다. 확인했는데 이미지의 경로가 정확하고 이미지에 액세스하고 있지만 UIImageView로 설정할 수는 없습니다. UIImageView 콘센트 클래스의 맨 설정했습니다. 왜 이런 일이 일어나는 걸까요? 전에 UIImageView를이 방식으로 설정했지만 지금은 작동하지 않습니다.

답변

1

기본적으로 문제는 느낌표를 사용하는 것입니다. 느낌표는 절대로 안전하지 않습니다! 위험한 신호 인 "나쁜 냄새"가 될 수 있으며, 코드에서 그 신호는 그대로입니다.

(1)

I have the UIImageView outlet set at the top of the class.

하지만가이 설정 방법 을 표시하지 않습니다. largeMapView이 무엇인지 또는 어떻게 선언되어 있는지 표시하지 않습니다. 선언은 다음과 같습니다

@IBOutlet var largeMapView : UIImageView! 

그렇다면, 즉 나쁜 - 그 암시 적으로 풀어 선택 사항이 전무 수 있습니다 의미합니다. 이것은 귀하의 문제의 근원 일 수 있습니다. 조건 적으로 래핑되지 않은 옵션을 사용하면 문제를 은폐 할 수 있습니다. - nil로 설정하려고 시도 할 때까지 충돌합니다. 제대로 설정되지 않으면 충돌의 원인이됩니다. 같은 같은 라인을 따라

(2)

, 코드의 나머지 부분도 강제로 포장을 벗긴 안 (! 후위 연산자 사용) 선택적 개체를 당신은 그들이 전무가 될 수 없다 특정에 대해 알지 못한다면 . 다음과 같이 다시 작성하는 모든 옵션은 조건부 안전하게 풀어되도록 :

if let d = manager.contentsAtPath(documentsPath+"/Flight"+(sender.tag.description)+"/Map.png") { 
    if let image = UIImage(data: d) { 
     largeMapView.image = image 
    } 
} 

이 방법을 contentsAtPath가 실패하거나 UIImage(data:)이 실패 할 경우, 아무 일도 일어나지 않습니다 - 당신은 당신의 이미지를 설정하지 않습니다 -하지만 적어도 당신이 충돌하지 않습니다 . 그리고 디버거에서 스테핑을 사용하여 의 위치가 어디인지 파악할 수 있습니다.가 실패했습니다. - 그러나 문제가 있다면 largeMapView은 함축적으로 래핑되지 않습니다. 옵션입니다.

+0

당신이 제안한대로 안전한 언 래핑을 구현합니다. 응용 프로그램을 실행하면 이미지가 안전하게 풀리지 만 끝까지 계속되며 'largeMapView.image = image'에서 충돌하고 옵션을 언 래핑하는 동안 예기치 않게 nil이 발견되어 내가 작성한 콘센트에 질문하게됩니다. – user3185748

+0

수정하십시오. 그것이 내가 콘센트에 질문하는 이유입니다. 나는 네 사고가 순전히 진단이라고 믿는다. _real_ 문제는 콘센트가 설정되어 있지 않다는 것입니다. 그러나 그것은 다른 이슈가 될 것입니다! 내가 실제로 제기 한 질문에 대한 답변을 얻었습니다. 즉, 왜 처음부터 충돌하고있는 것입니까? – matt

+0

도움을 주셔서 감사하지만 문제를 해결할 때까지 계속 노력해야합니다. 그들에게 기쁜 마음으로 생각한다면 어떤 생각이 든다. – user3185748

관련 문제