类似代码的行为不一致

时间:2013-11-24 12:41:29

标签: objective-c uitableview

我是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的生命周期中遗漏一些东西。

任何建议都会受到欢迎。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您的viewDidLoad行会调用

alloc] init。 您有2个选项可以完成这项工作。

1,您可以更改init方法并为其添加另一个参数,例如

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

然后抓取selectedItem并将其设置为实例变量,以便viewDidLoad可以使用它。

2,您可以从viewDidLoad移动您的用户界面代码  到viewWillAppear,因为在添加到视图中之前不会调用它。