【问题标题】:Objective C Segue identityObjective C Segue 身份
【发布时间】:2013-01-27 16:53:58
【问题描述】:

我有一个非常简单的问题。假设您有 2 个视图控制器 A 和 B。A 是带有 STATIC CELLS 的 UITableView。也就是说,A 仅使用情节提要对象构建,而不是以编程方式构建。 B 也是一个 UITableView,但使用 DYNAMIC CELLS 以编程方式构建。因此,我将 A 中每个单元格的 Segues(在情节提要中设置了标识符)连接到 B Tableview。

现在我想知道当 A 中的一行被选中时,哪个 segue 被推送了。我知道如果我以编程方式在视图 A 中创建单元格并使用准备/执行 segue 方法,这可以很容易地完成。但由于 A 中的内容永远不会改变,我不想走那条路。当我在 A 中选择给定行时,我试图找出如何检查已推送哪个 segue 的原因。理想情况下,将有一些方法 DIDPERFORMSEGUE:(Segue 标识符)我可以从 B Viewcontroller 调用。

非常感谢您的帮助和建议。

【问题讨论】:

  • 您是否尝试在控制器 A 中没有任何代码的情况下执行此操作?如果是这样,我认为这是不可能的。
  • 是的,这就是目标。我想有一种方法可以从 B 知道,因为正在执行 segue(即知道正在执行什么 segue 的隐藏代码)。
  • 好吧,继续想象,但我认为你不走运。
  • 好的,感谢 vm 的反馈。

标签: ios objective-c uistoryboard uistoryboardsegue


【解决方案1】:

在您的“A”表视图中,您应该能够查看戳了哪一行,然后将该信息推送到您的“B”表。例如:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([[segue identifier] isEqualToString:@"UITableView_B"]){
        BTableViewController *vc = (BTableViewController *)[segue destinationViewController];
        NSIndexPath *path;
        path = [self.tableView indexPathForSelectedRow];
        [vc setSelectedPath:path];
    }
}

希望对您有所帮助。祝你好运。

编辑:可能很明显,但在上面的“self.tableView”是一个指向 UITableView 的出口。

更新 就个人而言,我会硬着头皮为“A”创建一个类,但为了黑客攻击 - 应该可以返回并从以前的视图中获取数据。这是“坏代码”(imo),并假设您使用的是导航控制器 - 并且前一个视图是“A”表等......事不宜迟 - 应该可以这样做:

NSArray * views = [self.navigationController viewControllers];
NSUInteger prevViewIndex = [views count] - 2;
UIViewController * previousView = [views objectAtIndex:prevViewIndex];
ATableViewController * aTableViewController = (ATableViewController *) previousView;
NSIndexPath *path = [aTableViewController.tableView indexPathForSelectedRow];

【讨论】:

  • 嗨,戴夫,感谢您的回答。但是,我试图检查在 A 中没有完成任何代码的情况下推送了哪个 segue。我试图在 B 中检查它。但是正如 rdelmar 在上面向我指出的那样,这似乎是不可能的,所以我要实现这在 A. 再次感谢。
  • 我通过快速破解更新了我的答案。它应该可以解决问题。
  • 现在很有创意!非常感谢,但我认为你是对的。我只会咬紧牙关。我正在使用传统方法(prepareforsegue)实施。再次感谢戴夫。
  • @Joel,-感谢您的绿色检查。在你的情况下;当你创建你的 UITableView 子类时,它唯一需要的方法是 prepareForSegue。您可以删除模板生成的所有其他内容。
  • 嘿,戴夫,在我们就这个话题进行交流之后(为了其他人的利益),这是我从另一个论坛收到的一个建议:“一种方法是添加一个跟踪所选 segue 的属性。你可以将它添加到呈现的 vc 中。您也可以将其添加到 appdelegate。或者您可以将 NSNotification 发送到 vc 或其他需要知道所选 segue 的此类对象。我选择在 A 中建立类并使用 perform segue,但我认为这些也是很好的解决方案。希望它可以帮助某人。干杯。
【解决方案2】:

我不能说我自己需要这样做,但如果您真的不想更改源视图控制器,或者如果您经常需要从目标视图控制器,一种方法是创建自己的 UIStoryboardSegue 子类。 segue 已经知道目标视图控制器,因此让目标有机会检查 segue 是一件简单的事情。像这样的东西应该可以解决问题:

@interface MyStoryboardSegue : UIStoryboardSegue
@end

@implementation MyStoryboardSegue

- (void)perform
{
    [super perform]

    if ([self.destinationViewController respondsToSelector:@selector(didPerformSegue:)]) {
        [self.destinationViewController didPerformSegue:self];
    }
}

@end

如果您出于其他原因已经在使用 UIStoryboardSegue 子类,这不是一个很好的解决方案。事实上,我什至还没有测试过代码,所以也许有一些我还没有想到的障碍。然而,关键是,如果您希望 segue 在执行时通知目的地,您可能可以安排它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2012-08-02
    相关资源
    最近更新 更多