一个 TableViewController,多个 segue 动作和返回
Posted
技术标签:
【中文标题】一个 TableViewController,多个 segue 动作和返回【英文标题】:One TableViewController, multiple segue actions and returns 【发布时间】:2014-06-19 16:49:15 【问题描述】:在开始之前,我必须指出通常的免责声明:我是 Objective-C 和 Xcode 的新手,因此我的问题可能很愚蠢——提前道歉。但是我们开始了:
我有三个不同的数组:
NSArray *parameter_array_1 = @[1,2,3,4]
NSArray *parameter_array_2 @[a,b,c,d]
NSArray *parameter_array_3 = @[1a,2b,3c,4d]
我想从根表视图控制器进入一个表视图控制器,显示每个数组,但一次只显示一次。我的问题是我只想使用一个表视图控制器(而不是三个不同的),但是一旦我调用委托返回选定的值,我就无法识别返回数组。
我想出了一个非常丑陋的解决方案,但我想听听其他想法和建议。
第 1 步:在 prepareForSegue 中,我在根 VC 和目标 VC 中都设置了一个标识符
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([sender isKindOfClass:[UITableViewCell class]])
if ([segue.identifier isEqualToString:@"toSelection"] )
UITableViewCell *cell = (UITableViewCell *)sender;
PTOptionViewController *targetVC = [segue destinationViewController];
targetVC.delegate = self;
if ([cell.reuseIdentifier isEqualToString:SEGUE_ARRAY_1])
targetVC.identifier = SEGUE_ARRAY_1;
targetVC.array1 = self.array1;
if ([cell.reuseIdentifier isEqualToString:SEGUE_ARRAY_2])
targetVC.identifier = SEGUE_ARRAY_2;
targetVC.array2 = self.array2;
if ([cell.reuseIdentifier isEqualToString:SEGUE_ARRAY_3])
targetVC.identifier = SEGUE_ARRAY_3;
targetVC.array3 = self.array3;
第 2 步:
在目标 tableview 控制器中,我使用相同的标识符来确定委托回调方法并完成
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if ([self.identifier isEqual:SEGUE_ARRAY_1]) [self.delegate returnArray1Object];
if ([self.identifier isEqual:SEGUE_ARRAY_2]) [self.delegate returnArray2Object];
if ([self.identifier isEqual:SEGUE_ARRAY_3]) [self.delegate returnArray3Object];
第 3 步: 在根视图控制器中,我有那些返回方法,然后允许我根据返回采取单独的操作。
我的问题:我是新手,但即使对我来说,这似乎也非常笨重和麻烦。它可能适用于两个或三个参数,但不能缩放并且容易出错。但有替代方案吗?我不想为每个参数创建一个新的表视图控制器和 segue?
有没有办法将数据传递给表视图控制器并捕获返回值,但使表视图控制器足够抽象,以便我可以为不同的数组调用它?也许有办法根据发送者确定委托方法?
提前致谢。
【问题讨论】:
【参考方案1】:你最好使用一个数组来保存你的数据:
NSArray *parameters = @[@[1,2,3,4],
@[a,b,c,d],
@[1a,2b,3c,4d]
];
didSelectRowAtIndexPath
-(void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
[self performSegueWithIdentifier:@"toSelection" sender:self];
prepareForSegue
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
NSIndexPath * indexPath = [self.tableView indexPathForSelectedRow];
if([segue.identifier isEqualToString:@"toSelection"])
PTOptionViewController * targetVC =
(PTOptionViewController *)segue.destinationViewController;
targetVC.dataArray =parameters[indexPath.row];
【讨论】:
好的,非常适合小费。我最初是这么想的,但后来我觉得为了显示一个子集而交出所有数据似乎很奇怪。但如果这是推荐的方式,那就太酷了...... @user3757285 实际上它并没有传递所有数据,注意在准备segue时,parameters[indexPath.row];
获取多维数组索引处的子集数据
谢谢 - 我刚刚注意到。非常感谢您的建议 - 我正在努力通过 Xcode :)
如果您不介意,我还有一个问题。目前,我使用多个委托方法将返回的参数值分配给不同的对象。使用这种新方法,我可以看到它如何帮助不必创建我的 segue 混乱,但我将如何识别委托方法中的返回数组?我认为我不能将 Indexpath 传递回根控制器?谢谢以上是关于一个 TableViewController,多个 segue 动作和返回的主要内容,如果未能解决你的问题,请参考以下文章
设置具有多个部分和按钮的 tableviewcontroller
故事板中 tableviewController 中的原型 tableview 单元格
在 TableViewController 上添加图像直到搜索栏处于非活动状态
XCode TableViewController 在 Objective-C 中详细介绍