我正在尝试开发一个表视图控制器,其中行连接到多个View Controllers
(TextField,TextView,TableView,DatePicker,ImageView等)。
因此,如果我点击任何一行,它应该打开Intermediate View
并将相应的控制器放在一个公共位置,其中所有控制器的其余部分都是相同的。假设我点击了索引所在的行映射到TableView。当它打开中间控制器时,它应该将tableview放在公共容器中,这个表视图应该来自单个TableView控制器,用于所有其他Tableview。
我是ios的新手并且无法设计它。
设计这个的最佳方法是什么?我该如何实现呢?
由于
答案 0 :(得分:6)
我建议不要在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连接的视图控制器,您可以将其与图像进行比较。
使用类似的方法创建其他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];