一个TableViewController,多个segue动作和返回

时间:2014-06-19 16:49:16

标签: ios objective-c uitableview

在开始之前,我必须指出通常的免责声明:我是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 个答案:

答案 0 :(得分:0)

最好使用数组数组来保存数据:

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];
    }
}