【问题标题】:If statement based on whatever the previous view controller wasIf 语句基于之前的视图控制器是什么
【发布时间】:2015-12-23 09:49:51
【问题描述】:

这是我到目前为止所做的:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (preivousViewController isEqualToString:@"...") 
    {
        if ([self.filteredArray count] == 0)
            self.person = self.users[indexPath.row];
        else
            self.person = self.filteredArray[indexPath.row];
        self.mugshot = cell.imageView.image;

        [self performSegueWithIdentifier:@"SelectPerson" sender:self];
    } else {
        if ([self.filteredArray count] == 0)
            self.person = self.users[indexPath.row];
        else
            self.person = self.filteredArray[indexPath.row];
        self.mugshot = cell.imageView.image;

        [self performSegueWithIdentifier:@"selectVisitee" sender:self];
    }
}

它看起来很乱,这就是我试图修复它的原因(previousViewController 部分只是为了向你展示我想要尝试做的事情)。

我想说的是:如果你是通过这个 segue 或者从名为 suchandsuch 的那个视图控制器获得这个视图的,那么执行这个 segue 或那个 segue。有什么办法可以做到吗?

【问题讨论】:

  • 你不应该使用前一个视图控制器的名字。触发此控制器的 segue 的控制器应设置一个标志(可能是一个枚举)以指定您正在执行哪种类型的“编辑”,然后您应该使用它来决定要做什么。您的其他代码在 if 的每个分支中也是相同的,因此应该在 if... 之前完成
  • 您可以删除代码重复,因为两个分支中的前 5 行完全相同。只需将该部分移到实际的 if 块前面。
  • 我可以不使用上一个用于进入此视图的 segue 来确定接下来要使用哪个 segue 吗?
  • 是的,但是使用enumBOOL 来识别它是哪个视图控制器。查看重复项,看看两个块之间有什么不同。基本上唯一的条件逻辑是围绕下一个标识符的名称;即NSString *nextVC = _previousViewControllerWasSomething ? @"SelectPerson" : @"SelectVisitee";.

标签: ios objective-c segue uistoryboard viewcontroller


【解决方案1】:

您可以从 Navigation Controller 中查看堆栈的上一个 ViewController。

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

           if ([self.filteredArray count] == 0)
                self.person = self.users[indexPath.row];
            else
                self.person = self.filteredArray[indexPath.row];
            self.mugshot = cell.imageView.image;

            //Not the viewcontroller name string. Use the ViewController class name
            if ([self backViewController] == YOURVIEWCONTROLLER) 
           {

            [self performSegueWithIdentifier:@"SelectPerson" sender:self];

        } else {

        [self performSegueWithIdentifier:@"selectVisitee" sender:self];

        }
}

使用下面这个方法,

- (UIViewController *)backViewController
{
    NSInteger numberOfViewControllers = self.navigationController.viewControllers.count;

    if (numberOfViewControllers < 2)
        return nil;
    else
        return [self.navigationController.viewControllers objectAtIndex:numberOfViewControllers - 2];
}

【讨论】:

  • 我喜欢这个解决方案。
  • 很好的解决方案,但是为什么要从第一个 if 语句中省略大括号。只是让阅读变得不那么清晰......
猜你喜欢
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
相关资源
最近更新 更多