【问题标题】:How to search Segue Identifier in storyboard?如何在情节提要中搜索 Segue 标识符?
【发布时间】:2014-08-29 01:06:54
【问题描述】:

我的storyboard 中有很多controller,我正在打电话。

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

如果我想在 xcode 故事板中搜索 controllersomeIdentifier 关联,那么我该怎么做?

有什么办法或者我必须点击并检查所有controller

【问题讨论】:

  • 我会在 XML 源代码 (Open As | Source Code) 中搜索视图控制器的名称并从那里获取。

标签: ios swift xcode storyboard


【解决方案1】:

按照 Drux 的建议:

我找到的最好方法是在 XML 源代码(Open As | Source Code)中搜索 Segue Identifier 以获取视图控制器的名称并从那里获取。

【讨论】:

    【解决方案2】:

    不幸的是,在代码中无法找到视图控制器/情节提要场景的情节提要标识符。

    您可以考虑在您的项目中添加一个额外的目标/构建阶段,该阶段运行一个脚本以从情节提要 XML 中提取 segue 标识符并转换为您可以导入的常量文件。然后你得到字符串的运行时检查。

    类似这样的东西(用于 push segues):

    grep -r -h  "kind=\"push\"" *.storyboard | sed -e 's/.*identifier="\(.*\)".*id=\".*/extern NSString * const XXXSegueName_\1;/' | sort | uniq  > "XXXSegueConstants.h"
    grep -r -h  "kind=\"push\"" *.storyboard | sed -e 's/.*identifier="\(.*\)".*id=\".*/NSString * const XXXSegueName_\1 = @\"\1\";/' | sort | uniq  > "XXXSegueConstants.m"
    

    应该给你:

    extern NSString * const HDCSegueName_PushMyViewController;
    

    NSString * const HDCSegueName_PushMyViewController = @"PushMyViewController";
    

    我会将其他 segue 类型留给读者练习!

    【讨论】:

      【解决方案3】:

      没有直接的方法可以通过他的 segueIdentifier 获取 viewController,但是您可以在 prepareForSegue 中访问目标控制器

      - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
      {
          DestinationViewController * nextVC = segue.destinationViewController; 
      
      } 
      

      【讨论】:

        【解决方案4】:

        我认为在 UIStoryboard 中没有直接的方法,但也许你可以从代码中得到它,像这样在源视图控制器中实现 prepareForSegue

        - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender  {
            UIViewController * nextVC = segue.destinationViewController; 
            if ([segue.identifier compare:@"someIdentifier"] == NSOrderedSame) {
                 NSLog(@"%@", [nextVC class]);
            }
        } 
        

        这将打印您的目标视图控制器的名称

        【讨论】:

          【解决方案5】:

          没有办法通过公共 API,但您可以使用这个私有 API 进行测试:

          id<NSObject> template = [cell performSelector:NSSelectorFromString(@"selectionSegueTemplate")];
            if (template) {
              [template performSelector:NSSelectorFromString(@"perform:") withObject:cell];
            }
          

          来源:https://github.com/soutaro/Obihiro

          您可能希望在此之前调用 selectRow,以防您在 prepareForSegue 中使用 indexPathOfSelectedRow。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-09-25
            • 2013-03-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多