【问题标题】:Table View Controller each row connected to different view controllerTable 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?
  • 更新了我的问题。请看一下。

标签: ios objective-c uitableview uiviewcontroller


【解决方案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>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2018-04-25
  • 2019-09-09
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多