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

Posted

技术标签:

【中文标题】Table View Controller 每行连接到不同的视图控制器【英文标题】:Table View Controller each row connected to different view controller 【发布时间】:2015-01-05 08:17:17 【问题描述】:

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

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

我是 ios 新手,无法设计这个。

最好的设计方法是什么?我该如何实现?

谢谢

【问题讨论】:

这太宽泛了:您的问题是关于如何捕获所选单元格的索引或如何解析到适当的VC或如何segue? 更新了我的问题。请看一下。 【参考方案1】:

我建议不要在 Storyboard 中创建单元格并连接它。而是在情节提要中留下空表并使用代码创建单元格。您可以通过子类化UITableViewCell 创建自定义单元格。

在情节提要中,您只需使用 segue 将表视图与所有视图控制器链接并为其提供正确的 标识符名称

现在实现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 连接的视图控制器,您可以将其与图像进行比较。

使用类似的方式创建其他segues并在不同的switch case中以didSelectRowAtIndexPath方法调用它们。

此外,如果您想将任何值传递给推送控制器,请覆盖以下方法:

- (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];

【讨论】:

一切都清楚了。现在,如果我想从 TableViewController 加载控制器(即 -Tableview),该表视图是在 viewDidLoad() 中生成的。如何在这个topView中将tableview添加为子视图? 为此,您可以直接在-viewDidLoad() 方法中创建UITableView 对象。并添加为子视图,“或”您可以将此 topView 创建为不同的类(管理该类中的表视图和委托),只需在 -viewDidLoad() 中创建此子类的对象。 我已经这样做了,对于所有其他领域它工作正常。但是对于 tableview,它的失败原因是 [UIImage numberOfSectionInTableView]。我无法设置数据源和委托。 创建对象后需要设置tableView的delegate和datasource。喜欢[self.tableView setDelegate:self]; [self.tableView setDatasource:self]; 并使用UITableViewDelegateUITableViewDatasource 扩展视图控制器接口。喜欢@interface IntermediateController () <UITableViewDataSource, UITableViewDelegate>

以上是关于Table View Controller 每行连接到不同的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 Table View Cell 传递到 IOS 中的 View Controller

在 Table View Controller 中水平滚动 UITableView

Xcode Table View Controller with Nav Controller 不显示表格单元格,而是处理单元格中的数据

如何在 Xcode Interface Builder 中将导航项添加到 Table View Controller(带有静态单元格)?

在 Interface Builder 中创建的 Table View Controller 的底部单元格在 iPhone X 上被剪裁和隐藏

iOS 开发 - 如何使用自定义 Table View Controller 显示在 Interface Builder 中创建的静态单元格?