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];
并使用UITableViewDelegate
和UITableViewDatasource
扩展视图控制器接口。喜欢@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 中创建的静态单元格?