Table View Controller每行连接到不同的视图控制器

时间:2015-01-05 08:17:17

标签: ios objective-c uitableview uiviewcontroller

我正在尝试开发一个表视图控制器,其中行连接到多个View Controllers(TextField,TextView,TableView,DatePicker,ImageView等)。

因此,如果我点击任何一行,它应该打开Intermediate View并将相应的控制器放在一个公共位置,其中所有控制器的其余部分都是相同的。假设我点击了索引所在的行映射到TableView。当它打开中间控制器时,它应该将tableview放在公共容器中,这个表视图应该来自单个TableView控制器,用于所有其他Tableview。

我是ios的新手并且无法设计它。

设计这个的最佳方法是什么?我该如何实现呢?

Root Table View

enter image description here

由于

1 个答案:

答案 0 :(得分:6)

我建议不要在Storyboard中创建单元格并连接它。而是在故事板中留下空表并使用代码创建单元格。您可以通过继承UITableViewCell来创建自定义单元格。

在故事板中,您只需使用segue将表视图链接到所有视图控制器,并为其指定正确的标识符名称

enter image description here

现在实现UITableView的所有委托方法。覆盖-tableView:didSelectRowAtIndexPath:方法和行选择为特定行执行segue。

示例:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    switch (indexPath.row) {
        case 0:
            [self performSegueWithIdentifier:@"BasicCoreDataSegue" sender:self];
            break;

        default:
            break;
    }
}

在上面的例子中,如果您选择第一行,它将推送与Storyboard中的BasicCoreDataSegue segue连接的视图控制器,您可以将其与图像进行比较。

使用类似的方法创建其他segue并在didSelectRowAtIndexPath方法中以不同的切换方式调用它们。

此外,如果要将任何值传递给push controller,请覆盖以下方法:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
    if ([[segue identifier] isEqualToString:@"BasicCoreDataSegue"]) {
        // Get reference to the destination view controller
        TextViewController *vc = [segue destinationViewController];
        vc.textView.text = "Hello";
    }
} 

编辑:

以上代码适用于通用控制器。现在,您还不需要在didSelectRowAtIndexPath方法集中间控制器segue中创建更多segue。

使用[self.tableView indexPathForSelectedRow]方法在prepareForSegue方法中获取所选行。

例如:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        [self performSegueWithIdentifier:@"BasicCoreDataSegue" sender:self];
}

现在调用prepareForSegue时,为中级控制器设置整数值。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        // Get the new view controller using [segue destinationViewController].

        // You can get selected row using below line
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        // Pass the selected object to the new view controller.
        if ([[segue identifier] isEqualToString:@"BasicCoreDataSegue"]) {
            // Get reference to the destination view controller
            IntermediateController *vc = [segue destinationViewController];
            vc.selectedIndex = indexPath.row;
        }
    }

在上面的代码中,selectedIndex是一个整数变量,用于跟踪选择的行。

现在在-viewDidLoad()中的中间控制器中使用switch case从行选择中获取所需的控制器对象,并将其视图作为子视图添加到中间控制器中。

UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                         bundle: nil];

TextViewController *controller = (TextViewController*)[storyBoard 
                    instantiateViewControllerWithIdentifier: @"TextViewControllerId"];

[self.topView addSubview:controller.view];