使用UITableViewController在故事板上提供建议

时间:2012-10-19 14:00:40

标签: iphone objective-c ios xcode ipad

我有一个带有按钮主页的故事板,触摸一个带有嵌入式tableviewcontroller的导航控制器的按钮。当tableview出现时,它会填充一个项目列表。当用户触摸列表中的项目时,我想推送另一个tableview或详细信息视图。

这是我正在做的事情:

在我的ListTableViewController中,我这是我的didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    int row = [indexPath row];
    DSObject * obj = _m_DSObjects[row];

    if (obj.nType == 1)
    {
        ListTableViewController * tvc = [[ListTableViewController alloc]
                                               initWithStyle:UITableViewStylePlain];
        [self.navigationController pushViewController:tvc animated:YES];
    }
    else
    {
        MyDetaisViewController * vc = [[MyDetaisViewController alloc]
                                               initWithStyle:UITableViewStylePlain];
        [self.navigationController pushViewController:vc animated:YES];
    }
}

基本上如果它是类型1(另一个列表),那么我想创建另一个ListViewController,但如果它是类型2,(详细信息),那么我想显示我的详细信息视图。

我的问题是,如果它是一个列表,我的列表不会填充这些项目。单元格行在那里,但是它们是空白的,它似乎没有使用我的单元格原型。

如果我做错了,我正在寻找关于如何完成我需要的建议。

感谢您的帮助!!

1 个答案:

答案 0 :(得分:1)

更好的方法,因为您已经在使用故事板,就是从ListTableViewController创建一个segue到您的新列表控制器,以及您的详细视图控制器。

然后您可以将didSelectRowAtIndexPath更改为以下内容:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    int row = [indexPath row];
    DSObject * obj = _m_DSObjects[row];

    if (obj.nType == 1)
    {
        // assuming you named your segue "PresentListController"
        [self performSegueWithIdentifier:@"PresentListController" sender:self];
    }
    else
    {   // assuming you named your segue "PresentDetailsController"
        [self performSegueWithIdentifier:@"PresentDetailsController" sender:self];
    }
}

如果您需要将参数传递给其中任何参数,可以使用prepareForSegue

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.destinationViewController isKindOfClass:[ListTableViewController class]]) {

        ListTableViewController* listController = (ListTableViewController*)segue.destinationViewController;            
        listController.someParam = someValue;

        return;        
    }

    if ([segue.destinationViewController isKindOfClass:[MyDetailsViewController class]]) {

        MyDetailsViewController* detailsController = (MyDetailsViewController*)segue.destinationViewController;
        detailsController.someOtherParam = someOtherValue;

        return;
    }
}

修改

prepareForSegue而不是检查class的{​​{1}},您可以使用destinationViewController检查正确的segue,只是另一种方法来检查segue的去向