【问题标题】:Programmatically enumerate outgoing Segues for a UIViewController以编程方式枚举 UIViewController 的传出 Segue
【发布时间】:2019-12-06 06:26:00
【问题描述】:

对于视图控制器之间的 iOS 5 导航,UIViewController 类提供了[self performSegueWithIdentifier:@"MySegue" sender:sender] 选择器。据推测,在幕后,故事板实现知道从任何视图控制器传出的 segue 标识符列表,即[@"MySegue", @"MySegue2"]。有没有办法以编程方式访问此列表,以获取可以传递给 performSegueWithIdentifier 的标识符?

【问题讨论】:

    标签: iphone objective-c ios xcode


    【解决方案1】:

    这是一个未记录的行为,但是

    NSArray *segueTemplates = [self valueForKey:@"storyboardSegueTemplates"] ;  
    

    应该返回一个数组,其中包含可以传递给performSegueWithIdentifier 的所有可能的segue 值。

    【讨论】:

    【解决方案2】:

    没有用于枚举情节提要中的转场的公共 API。

    【讨论】:

    • 伤心。所以我唯一的选择是在抛出异常时捕获它......这不像Apple。
    • 我想用 ios9 重新评估一下 [虽然我的希望渺茫 :D]
    【解决方案3】:

    对于 Objective-C,如果我知道 segue 名称,我曾经使用它。

    - (BOOL)isValidSegueId:(NSString *)segueId {
        NSArray *filteredArray = [[self valueForKey:@"storyboardSegueTemplates"] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"identifier = %@", segueId]];
        return filteredArray.count > 0;
    }
    

    斯威夫特:

        func isValidSegueId(_ segueId: String?) -> Bool {
        let filteredArray = (value(forKey: "storyboardSegueTemplates") as? NSArray)?.filtered(using: NSPredicate(format: "identifier = %@", segueId ?? ""))
        return (filteredArray?.count ?? 0) > 0
    }
    

    您可以将其与此链接 https://stackoverflow.com/a/35060917/1058199 结合使用,以获取当前视图控制器的所有 segue 并验证每个。

    【讨论】:

      【解决方案4】:

      将所有与视图控制器相关的segue存储在一个数组中,然后在视图控制器中访问该数组。

      【讨论】:

      • 所有转场s.
      猜你喜欢
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 2018-07-10
      相关资源
      最近更新 更多