0

내 앱에 그룹화 된 테이블을 설정하고 새로운보기로 푸시하면 올바르게 작동합니다. 한가지를 제외하고. 제목과 스택 레이아웃이 모두 이상합니다. 고장의 원인은 다음과 같습니다.iPhone : 그룹화 된 테이블 및 내비게이션 컨트롤러 문제

  1. 테이블에 두 개의 섹션이 있습니다.
  2. 첫 번째 섹션의 첫 번째 행을 누르면 올바른보기로 이동하지만 새 뷰의 제목은 테이블의 두 번째 섹션에있는 첫 번째 행의 이름입니다.
  3. 차례로 첫 번째 섹션 제목의 두 번째 행은 두 번째 섹션 제목의 두 번째 행입니다. I 루트 뷰 표의 두 번째 섹션의 번째 행에 탭하면

는 네비게이션 버튼은 테이블의 제 섹션의 두 번째 행으로 진행한다.


표 1 절
행 1
행 2
행 3

표 2 절
행 A :

그래서 여기 내 테이블의 다이어그램입니다
행 B
행 C


내가 3 행에 탭한다면, 푸쉬보기의 제목은 탐색 버튼을 누른 다음, 결국에 끝나는 3 행으로 돌아가 나에게 말한다 행 C.입니다 루트보기.

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

    //CSS 
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"CSS"]) 
    { 
     CSSViewController *css = [[CSSViewController alloc] initWithNibName:@"CSSViewController" bundle:nil]; 
     [css setTitle:@"CSS"]; 
     [self.navigationController pushViewController:css animated:YES]; 
    } 

    //HTML 
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"HTML"]) 
    { 
     HTMLViewController *html = [[HTMLViewController alloc] initWithNibName:@"HTMLViewController" bundle:nil]; 
     [html setTitle:@"HTML"]; 
     [self.navigationController pushViewController:html animated:YES]; 
    } 

    //JS 
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"JavaScript"]) 
    { 
     JSViewController *js = [[JSViewController alloc] initWithNibName:@"JSViewController" bundle:nil]; 
     [js setTitle:@"JavaScript"]; 
     [self.navigationController pushViewController:js animated:YES]; 
    } 

    //PHP 
    if ([[arryServerSide objectAtIndex:indexPath.row] isEqual:@"PHP"]) 
    { 
     PHPViewController *php = [[PHPViewController alloc] initWithNibName:@"PHPViewController" bundle:nil]; 
     [php setTitle:@"PHP"]; 
     [self.navigationController pushViewController:php animated:YES]; 
    } 

    //SQL 
    if ([[arryServerSide objectAtIndex:indexPath.row] isEqual:@"SQL"]) 
    { 
     SQLViewController *sql = [[SQLViewController alloc] initWithNibName:@"SQLViewController" bundle:nil]; 
     [sql setTitle:@"SQL"]; 
     [self.navigationController pushViewController:sql animated:YES]; 
    } 

& 테이블의 데이터를 공급 배열 :

- (void)viewDidLoad { 
    [super viewDidLoad]; 


    arryClientSide = [[NSArray alloc] initWithObjects:@"CSS",@"HTML",@"JavaScript",nil]; 
    arryServerSide = [[NSArray alloc] initWithObjects:@"Objective-C", @"PHP",@"SQL",nil]; 
    // arryResources = [[NSArray alloc] initWithObjects:@"HTML Colour Codes", @"Useful Resources", @"About",nil]; 
    self.title = @"Select a Language"; 
    [super viewDidLoad]; 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem; 
} 

어떤 도움이 크게 감사하겠습니다

다음은 뷰를 밀어 내 구현 파일입니다.

+2

신성 메모리 누수, 배트맨! (당신이'alloc/init' 할 때마다 새로운 viewController를 푸시 한 후에 그것을 릴리즈해야합니다.) –

+0

@ * 배트맨 *에게 +1하십시오! – bddckr

답변

4

사용자가 탭한 섹션을 결정하기 위해 if 문이 누락되었다고 생각합니다. NSIndexPath에는 행 속성과 섹션 속성이 모두 있습니다. 나는 보통 이런 식으로합니다 :

나는 당신이 그룹화 된 테이블을 사용하고 있다고 가정합니다. -dan

+0

신난다, 고마워. –

0

댄 권리

건배, 당신은 indexPath.section 변수를 사용해야합니다.다음과 같이하면 "행 1"을 클릭 한 후 일련의 개별 if 문을 사용하여 실제로 두 개의 뷰 컨트롤러를 밀고 있습니다.

isEqual : @ "CSS"가 true를 반환합니다. ,

푸시하는 CSS 뷰 컨트롤러, 다음

는 드롭 다운 (ISEQUAL ... 경우 : "HTML"@) 계속 확인 .. (있는 경우는 .. ISEQUAL : "자바 스크립트"@) 다음

물론 (is .. isEqual : @ "PHP"인 경우) 또한 true를 반환하고 PHP보기 컨트롤러를 누를 것입니다.

전체 응용 프로그램에 대해 잘 모르겠지만 여기 (메모리 누수 외에) 하나의 관찰은 각 언어에 대한 하나의보기 컨트롤러/펜촉이 있다는 것입니다.보기 컨트롤러에 크게 다른 동작/외양이있는 경우 당신이해야 할 일 이겠지만 각각의 유사점을 확인하고 하나의 "LanguageViewController"를 만들 수 없는지 확인하고, 어떤 언어로 표현하고 초기화 할 것인지/속성을 설정하는 것이 좋습니다. 그걸 바탕으로보기 컨트롤러의. 이것은 적용되지 않을 수도 있지만 그렇게하면 많은 작업을 줄일 수 있습니다!

+0

언급 한 마지막 사항에 관해서, 모든 언어를 제어 할 수있는 펜촉이 필요합니까? Xcode에서 viewcontroller를 만들 때 개별 펜촉을 만들었습니다. 그런 다음 뷰 컨트롤러에 배열을 추가 테이블을 생성하는 피드. plist에서 각 프로그래밍 언어의 데이터를 피드 할 수 있습니까? 그리고 나는 plist의 각 아이템을 제어하기위한 네비게이션 컨트롤러를 만들 수 있을까요? –

+0

네, "LanguageViewController"(그리고 펜촉)를 만들고, 추가 언어 문자열 인자를 가진 커스텀 init 함수를 생성 한 다음, init 함수처럼 (다음은 Psuedo-code입니다) : (언어가 "CSS"인 경우) CSS.plist에서 데이터를로드합니다. else if (언어가 "HTML"과 같음) HTML.plist에서 데이터를로드합니다. 등. 의심의 여지가있을 때 당신에게 가장 이해가되는 것일뿐입니다. – Tom

+0

맞아요. 그래서 새로운 언어 뷰 컨트롤러 nib에 모든 initWithNibName을 수정하면 되겠습니까? –