2012-04-30 2 views
0

나는 객관적인 C와 XCode 4.2로 아이폰 개발을 처음 사용한다. 지금은 성공적으로 UITableViewController를 인스턴스화하고 다중 레벨 json 데이터 트리를 탐색 할 수 있습니다. 그러나 리프 페이지의 UI를 설정하는 데 문제가 있습니다. 내가 지금까지 당신에게 코드의 조각을 보여주지 :iphone uiviewcontroller not displayed?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
     int row = [indexPath row]; 
     NSString * currentrow = [NSString stringWithFormat:@"%d.",row]; 


     NSDictionary * item = [dataArray objectForKey:currentrow]; 
     NSDictionary * children = [item objectForKey:@"children"]; 
     if(children != nil) 
     { 
      uinavTableViewController *childView = [[uinavTableViewController alloc] init]; 
      childView.dataArray = children; 
      [self.navigationController pushViewController:childView animated:YES]; 
     } 
     else 
     { 
      uinavMenuItem * childView = [[uinavMenuItem alloc] init]; 
      //uinavSecondViewController * childView = [[uinavSecondViewController alloc] init]; 
      [self.navigationController pushViewController:childView animated:YES]; 
     } 
} 

그래서의 첫 번째 부분은 아이 노드가있는 경우 그래서 다른 uinavTableViewController을 만드는 경우 문이 확인됩니다. 이 부분은 완벽하게 작동합니다.

else 문은 uinavMenuItem을 사용하여 리프 페이지를 만듭니다. 시뮬레이터에서 이것을 실행하면 리프 페이지는 검은 색 화면에 불과합니다. 내 NSLog에서 보았고 uinavMenuItem viewDidLoad가 시작되었는지 확인할 수 있습니다. 그래서 컨트롤러 코드는 정상적으로 작동하지만 스토리 보드에 그려진 뷰에 연결하는 방법을 모르겠습니다.

내가 storyboarD에서 그린 것을 uinavMenuItem이 표시하지 못하게하는 것은 무엇을 잘못하고 있습니까?

답변

2

스토리 보드에서 만든보기 컨트롤러를 초기화하려면 UIStoryboard-instantiateViewControllerWithIdentifier을 사용하십시오. 이 식별자는 스토리 컨트롤러에서보기 컨트롤러의 속성 아래에 정의합니다. 스토리 보드에있는 항목이로드되지 않아보기가로드되었지만 비어 있습니다. 찾을 수 없으므로 아마 -loadView이라고합니다.

Enter the identifier here

+0

감사합니다. "보기 컨트롤러의 속성 아래에서 스토리 보드의 식별자를 정의 하시겠습니까?" Xcode 패널을 둘러 보았지만 명확히하기 위해 instantiateViewContollerWithIdentifier – John

+0

과 같은 이미지를 찾아 낼 수 없습니다. – Morrowless

+0

알았어, 나는 식별자를 만들었다. 그리고 나서 다음과 같이 else 문을 대체했습니다 :'uinavMenuItem * childView = [self.storyboard instantiateViewControllerWithIdentifier : @ "menuleafsegue"]; [self.navigationController pushViewController : childView animated : YES];'올바른 줄을 따라 왔습니까? 지금 시뮬레이터는 내 uinavMenuItem에 가지 않습니다. – John

0

스토리 보드를 사용하는 경우 UITableViewController에서 리프 컨트롤러로 바로 만들기가 쉽습니다. 테이블 뷰 컨트롤러를 Control- 클릭 한 다음 Push Segue를 리프 컨트롤러로 드래그하여이를 수행 할 수 있습니다. X-Code 사이드 바 안에 segue와 identifier를 입력하십시오. 코드에서 다음

대신 [self.navigationController pushViewController]를 호출하면 사용할 수 있습니다

- (void)prepareForSegue: (UIStoryboardSegue *)segue sender: (id)sender 
{ 
    // Because you have two segues, you need to check the identifier 
    if ([[segue identifier] isEqualToString: @"YourIdentifierHere"]) 
    { 
     uinavTableViewController childView = (uinavTableViewController *)segue.destinationViewController; 
     childView.dataArray = children; 
    } 
} 
:

if(children != nil) 
{ 
    [self performSegueWithIdentifier: @"YourIdentifierHere" sender: self]; 
} 
else 
{ 
    [self [performSegueWithIdentifier: @"TheOtherIdentifier" sender: self]; 
} 

당신이 SEGUE을 수행하는 동일한 컨트롤러에 prepareForSegue 방법을 사용 uinavTableViewController에 데이터를 전달하려면

+0

덕분에, 내가 SEGUE에게 ID를 부여 하우투 알아낼 수 없습니다 : 당신이 ID를 입력 할 경우 다음

입니다. 나는 Ctrl + xcode의 오른쪽 사이드 바에서 몇 thigns를 클릭했는데, 나는 분명히 segue 식별자에 관련된 것을 전혀 알지 못했다. – John

+0

먼저 "Storyboard Segues"아래에서 테이블 뷰 컨트롤러를 먼저 클릭하고 " 리프 컨트롤러로 "밀어 넣으십시오". Storyboard는 컨트롤러 사이에 화살표를 만듭니다 (이것은 세그). 화살표 (또는 화살표 중간에있는 아이콘)를 클릭하고 속성 관리자 (Xcode의 오른쪽 사이드 바, 왼쪽에서 네 번째 탭, 벨트 버클 모양)를 연 다음 "식별자"를 편집하십시오. 덕분에 –

+0

. 이제 시뮬레이터를 실행할 때 SIGABRT 오류가 발생합니다. 그래서 나는 이것이 메모리 오류라고 생각하거나 적절하게 인스턴스화하지 않았는가? – John