我是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对象声明为弱和非原子变量,并使用synthesize语句实现。
我已经检查过一个非零的对象被检索,所以很明显我必须在DetailViewController的生命周期中遗漏一些东西。
任何建议都会受到欢迎。在此先感谢您的帮助!
答案 0 :(得分:0)
viewDidLoad
行会调用 alloc] init
。
您有2个选项可以完成这项工作。
1,您可以更改init方法并为其添加另一个参数,例如
KTSDetalleArticuloViewController *detailViewController = [[KTSDetalleArticuloViewController alloc] initForNewItem: NO withSelectedItem:selectedItem withDelegate:self];
然后抓取selectedItem
并将其设置为实例变量,以便viewDidLoad
可以使用它。
2,您可以从viewDidLoad
移动您的用户界面代码
到viewWillAppear
,因为在添加到视图中之前不会调用它。