2013-11-24 4 views
1

저는 xcode와 objective-C에 매우 초짜입니다. 비슷한 코드에서 다른 동작을하기 때문에 혼란 스럽습니다. 제가 이야기의 코드는 다음과 같습니다비슷한 코드와 일치하지 않는 동작

이 코드는 무엇을 어떻게해야한다 않습니다
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    KTSDetalleVisitaViewController *detailViewController = [[KTSDetalleVisitaViewController alloc] initForNewItem: NO withDelegate:self]; 

    NSArray *items = [[KTSVisitasStore sharedStore]allItems]; 
    Visita *selectedItem = [items objectAtIndex:[indexPath row]]; 

    //Give detail view controller a pointer to the selected item 
    [detailViewController setItem:selectedItem]; 

    //Put the new detailViewController into the top of the navigation controller's stack 
    UINavigationController *nav = [[UINavigationController alloc] 
              initWithRootViewController:detailViewController]; 

    if (![self splitViewController]) { 
     [nav setToolbarHidden:NO]; 
     [nav setModalPresentationStyle: UIModalPresentationFullScreen]; 

     [nav setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; 

     [self presentViewController:nav animated:YES completion:nil]; 
    } else { 
     NSArray *nvc = [NSArray arrayWithObjects:[self navigationController], nav, nil]; 

     [[self splitViewController] setDelegate:detailViewController]; 
     [[self splitViewController] setViewControllers:nvc]; 
    } 
} 

가, 내 말은, 그것은 TableViewController에서 선택한 행과 일치하는있는 NSArray에서 요소를 취하고있는 요소를 넣어 장치 유형에 따라 별도의보기로 표시되는 DetailedViewController입니다. 내가 말했듯이이 코드는 완벽하게 작동합니다. 다른 클래스에

나는이 유사한 코드가 있습니다

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    KTSDetalleArticuloViewController *detailViewController = [[KTSDetalleArticuloViewController alloc] initForNewItem: NO withDelegate:self]; 

    NSArray *items = [[KTSArticuloStore sharedStore]allItems]; 
    Articulo *selectedItem = [items objectAtIndex:[indexPath row]]; 

    //Give detail view controller a pointer to the selected item 
    [detailViewController setItem:selectedItem]; 

    //Put the new detailViewController into the top of the navigation controller's stack 
    UINavigationController *nav = [[UINavigationController alloc] 
            initWithRootViewController:detailViewController]; 

    if (![self splitViewController]) { 
     [nav setToolbarHidden:NO]; 
     [nav setModalPresentationStyle: UIModalPresentationFullScreen]; 

     [nav setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; 

     [self presentViewController:nav animated:YES completion:nil]; 
    } else { 
     NSArray *nvc = [NSArray arrayWithObjects:[self navigationController], nav, nil]; 

     [[self splitViewController] setDelegate:detailViewController]; 
     [[self splitViewController] setViewControllers:nvc]; 
    } 
} 

정확히 같은 이전 코드가 않습니다 어떻게해야하지만, 그렇지 않습니다. 문제는 viewDidLoad 메서드가 setViewControllers 호출 전에 시작되고 해당 메서드 (viewDidLoad)에서 NSArray에서 검색 한 개체의 UI 정보를 설정하는 것입니다.

두 detailViewControllers * 항목 개체는 weak 및 nonatomic 변수로 선언되고 synthesize 문을 사용하여 구현됩니다.

나는 이미 nil 객체가 검색되지 않았는지 확인 했으므로 DetailViewController의 라이프 사이클에서 뭔가를 놓치고 있음을 분명히 알았습니다.

모든 조언을 매우 환영합니다. 도와 주셔서 미리 감사드립니다 !!

답변

0

viewDidLoadalloc] init 행에 호출됩니다. 이 작업을 수행하는 데는 두 가지 옵션이 있습니다.

1

, 당신은 초기화 방법을 변경할 수 있으며, 다음 selectedItem을 잡아 그래서 viewDidLoad 그것을 사용할 수있는 인스턴스 변수로 설정

KTSDetalleArticuloViewController *detailViewController = [[KTSDetalleArticuloViewController alloc] initForNewItem: NO withSelectedItem:selectedItem withDelegate:self]; 

처럼, 그것은 또 다른 매개 변수를 추가합니다.

2 UI 코드를 viewDidLoad 에서 viewWillAppear으로 옮길 수 있습니다. UI 코드는보기에 추가 될 때까지 호출되지 않으므로 이동할 수 있습니다.

+0

답변이 완벽하게 작동하지만이 코드가 두 경우 모두 다르게 작동하는 이유는 무엇입니까? 귀하의 대답을 읽기 전에 viewDidLoad에서 UI를 업데이트하는 코드를 작성하는 것이 적절한 장소가 아니라는 점에 동의합니다. 첫 번째 코드는 항상 UI를 올바르게 업데이트하지만 초는 아닙니다. – SantiFdezMunoz

+1

모든 코드를 보지 않고서는 왜 작동하는지 그다지 말할 수 없습니다. 내 생각 엔 UI가 처음 인스턴스의 어느 시점에서 새로 고쳐 지지만 2 단계는 새로 고칩니다. – Darren

+0

대런 감사합니다. 코드를 검토하고 이러한 종류의 새로 고침을 검색 할 것입니다. 도와 줘서 고마워. – SantiFdezMunoz

관련 문제