一个 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 中详细介绍

将 UITableView 委托和数据源从 tableViewController 中分离出来

从 tableviewcontroller 加载 tableviewcontroller 不起作用