【问题标题】:One TableViewController, multiple segue actions and returns一个 TableViewController,多个 segue 动作和返回
【发布时间】: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?

有没有办法将数据传递给表视图控制器并捕获返回值,但使表视图控制器足够抽象,以便我可以为不同的数组调用它?也许有办法根据发送者确定委托方法?

提前致谢。

【问题讨论】:

    标签: ios objective-c uitableview


    【解决方案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 传递回根控制器?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多