我對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的生命週期中丟失一些東西。
任何意見將非常歡迎。預先感謝您的幫助傢伙!
你的答案完美的工作,但爲什麼這兩個代碼在兩種情況下行爲不同。我同意,在閱讀你的答案之前,把代碼更新到viewDidLoad中的UI並不是正確的地方,但爲什麼它的工作方式不同?我的意思是,第一個代碼總是正確更新UI,但秒不會。 – SantiFdezMunoz
如果沒有看到你所有的代碼,我不能說它爲什麼會起作用,然後就不會。我的猜測是你會在第一時間刷新UI,但不是第二次。 – Darren
感謝Darren,我要審查我的代碼並尋找這種刷新。再次感謝你的幫助 – SantiFdezMunoz