2013-11-24 14 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]; 
    } 
} 

此代碼做什麼是應該做的,我的意思是,它需要從NSArray中,隨着一個TableViewController選定的行相匹配的元素,並把該元素在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 * item對象聲明爲weak和nonatomic變量,並使用synthesize語句實現。

我已經檢查過沒有零對象被檢索,所以很明顯我必須在DetailViewController的生命週期中丟失一些東西。

任何意見將非常歡迎。預先感謝您的幫助傢伙!

回答

0

viewDidLoad在您的alloc] init行上被調用。 你有2個選項來完成這項工作。

1,您可以更改init方法和其他參數添加到它,就像

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

然後抓住selectedItem並將其設置爲實例變量,以便viewDidLoad可以使用它。

2,您可以將您的UI代碼從viewDidLoad 移動到viewWillAppear,因爲直到它被添加到視圖纔會調用它。

+0

你的答案完美的工作,但爲什麼這兩個代碼在兩種情況下行爲不同。我同意,在閱讀你的答案之前,把代碼更新到viewDidLoad中的UI並不是正確的地方,但爲什麼它的工作方式不同?我的意思是,第一個代碼總是正確更新UI,但秒不會。 – SantiFdezMunoz

+1

如果沒有看到你所有的代碼,我不能說它爲什麼會起作用,然後就不會。我的猜測是你會在第一時間刷新UI,但不是第二次。 – Darren

+0

感謝Darren,我要審查我的代碼並尋找這種刷新。再次感謝你的幫助 – SantiFdezMunoz