2014-11-08 2 views
0

셀이있는 테이블 뷰 컨트롤러가 있습니다. 셀을 클릭하면 또 다른보기 컨트롤러가로드되고이보기 컨트롤러에서 요소를 처리하려고합니다. 자세히보기 컨트롤러에서 레이블을 배치하고 첫 번째 단계에서 레이블의 텍스트를 설정하려고하지만 예외가 발생합니다. fatal error: unexpectedly found nil while unwrapping an Optional value 및 이유를 모르겠습니다. 어떤 해결책이 있습니까?신속한 테이블 뷰 컨트롤러의 세부 정보 페이지 처리

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    let vcMissionDetail : ViewControllerMissionDetail = self.storyboard?.instantiateViewControllerWithIdentifier("MissionDetail") as ViewControllerMissionDetail; 

    //load detail view controller 
    self.presentViewController(vcMissionDetail, animated: true, completion: nil) 

    //set label text 
    //at this line I get the exception -> label is nil 
    vcMissionDetail.label.text = "Test" 
} 

그리고 이것은 내 상세보기 컨트롤러 (매우 간단)입니다 :

이 셀을 클릭하면 내 테이블 뷰 컨트롤러의 일부입니다

import UIKit 

class ViewControllerMissionDetail: UIViewController { 

    @IBOutlet var label: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

THX!

+0

오류 지점을 수행하는 코드의 어떤 라인에? –

+0

label이 nil이므로 오류가 발생합니다. 스토리 보드에있는 라벨을 UILabel에 연결하는 것을 잊었습니까? –

+0

'vcMissionDetail.label.text = "Test"'줄에 예외가 있습니다. 그리고 나는 또한 'label' 변수로 스토리 보드의 상세보기 컨트롤러에서 레이블을 참조했습니다 ('@IBOutlet var label : UILabel!'참조) – Martin

답변

0

instantiateViewControllerWithIdentifier은 여러 가지 이유로 실패 할 수 있으므로 선택 사항을 반환합니다. 그래서 당신은 더 나은 조건을 풀다해야

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    if let vcMissionDetail : ViewControllerMissionDetail = self.storyboard?.instantiateViewControllerWithIdentifier("MissionDetail") as ViewControllerMissionDetail { 

     //set label text before presenting the viewController 
     vcMissionDetail.label.text = "Test" 

     //load detail view controller 
     self.presentViewController(vcMissionDetail, animated: true, completion: nil) 
    } 
} 

또한 일을 두 번 확인하려면

이 인터페이스 빌더의 ID 관리자에서의 ViewController의 사용자 정의 클래스로 ViewControllerMissionDetail 설정되어 있습니까?

vcMissionDetail이 성공적으로 인스턴스화되고 여전히 충돌이 발생하면 InterfaceBuilder에서 라벨의 콘센트 연결을 삭제하고 다시 만드십시오. 신속한 들어

+0

당신이 언급했지만 성공하지 못한 것들을했습니다. 어제는 코드가 작동한다고 생각하지만 확실하지 않습니다. xcode의 버그 일 가능성이 있습니까? – Martin

+0

귀하의 IBOutlet 연결이 유효하지 않습니다. 연결을 삭제하고 다시 만들려고 했습니까? – zisoft

+0

예, 했어요. 또한 새 레이블을 추가하여 확인했지만 동일한 문제가 있습니다. 내가 인식 한 한 가지 ...자세히보기 컨트롤러에서 두 번째 레이블에 대한 두 번째 IBOutlet을 만든 후 테이블 뷰 컨트롤러에서이 레이블을 자동 완성 항목으로 호출하지 않았습니다. 어쩌면 Xcode의 문제일까요? Xcode를 다시 설치했지만 성공하지 못했습니다. – Martin

0

나는 당신의 문제에 대한 해결책이 꽤 간단하다고 생각합니다. 올바르게 이해했다면, didSelectRowAtIndexPath를 사용하여 테이블 뷰 컨트롤러에서 분리 할 때 상세 뷰 컨트롤러의 라벨을 변경하고 싶습니다. 아마도 실수를하는 곳은 상세보기 컨트롤러의 레이블을 테이블보기 컨트롤러에서 변경하려고합니다. 문제에 대한 올바른 접근 방법은 상세보기 컨트롤러의 'viewDidLoad'또는 'viewDidAppear'메소드에서 레이블 텍스트를 설정하는 것입니다.

override func viewDidLoad() { 
    super.viewDidLoad() 
    //set label text here 
} 
override func viewDidAppear() { 
    super.viewDidLoad() 
    //OR set label text here 
} 
+0

나중에 레이블 텍스트를 테이블 뷰 셀 이 정보는 테이블보기 컨트롤러 또는? 그리고 난 테이블 뷰 컨트롤러에서 자세히보기 컨트롤러를 instatiate. – Martin

+0

나는 이해할 수있다. 나는 비슷한 상황에 처해 있었다. 이것은 내가 사용했던 접근 방식입니다. (문제를 해결하는 가장 좋은 방법은 아니지만 그것은 저에게 효과적이었습니다). 테이블 뷰 컨트롤러의 didSelectRowAtIndexPath 메서드에서 전역 변수에 선택한 행의 셀 데이터를 저장합니다. 이제 세부보기 컨트롤러에서이 전역 변수를 사용하여 레이블 텍스트를 설정할 수 있습니다. –

0

:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    self.performSegueWithIdentifier("showItemDetail", sender: tableView) 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if segue.identifier == "showItemDetail" { 
     let indexPath:NSIndexPath = self.tableView.indexPathForSelectedRow()! 
     let detailVC:ItemDetailViewController = segue.destinationViewController as ItemDetailViewController 
     detailVC.item = items[indexPath.row] as Item 

    } 
} 
관련 문제