【问题标题】:NSInvalidArgumentException reason Receiver has no segue with identifierNSInvalidArgumentException 原因 Receiver has no segue with identifier
【发布时间】:2012-03-05 14:10:28
【问题描述】:

我遇到了问题。我有一个 UIViewController List 和一个 UIViewController Login。 在Login 上,我有一个“完成”按钮,在同一个 UIViewController 上还有另一个隐藏按钮,它与List 有一个segue(类型:push)。我在 xcode 的界面构建器中给它一个标识符,名为“LoginToList”。现在从另一个类(当Login 是活动控制器时运行的类)我调用:

[[Login sharedLogin] performSegueWithIdentifier:@"LoginToList"];

Login 类显然有一个标识符为"LoginToList" 的segue

但我不断得到:

 'NSInvalidArgumentException', reason: 'Receiver (<Login: 0x6d79d90>) has no segue with identifier 'LoginToList''

+ (id) sharedLogin 看起来像这样:

+ (id) sharedLogin {
    static Login *sharedLogin = nil;

    @synchronized(self) {
        if (sharedLogin == nil) {
            sharedLogin = [[self alloc] init];
        }

        return sharedLogin;
    }
}

如果有人知道它为什么这么说,我会很高兴听到它! :D我不知道我是否错过了一些愚蠢的东西,但我无法发现它:(

编辑:我使用 UIViewControllersselfves(LoginList)在 interfacebuilder 中创建了一个 segue(ctrl + 单击从 Login 拖动到 List)。然后我将segue命名为"LoginToList",换句话说,我给了它那个标识符。我点击了 segue,在右上角有一个我使用的“标识符”字段。

我仍然收到错误消息说Login 没有标识符"LoginToList" 的segue。 伤心

【问题讨论】:

  • LoginToList 是什么样的?您可以将该代码添加到您的问题中吗?
  • @AlanMoore LoginToList 不是代码,也不是类。 LoginToList 是我在界面生成器中创建的 segue 的标识符。
  • 啊,我错了,以为是选择器的名字!
  • @AlanMoore 大声笑不,我不清楚吗?对不起...
  • @SimonBarkhuizen 是嵌入在 UINavigationController 中的登录视图控制器吗?

标签: objective-c xcode segue uistoryboardsegue


【解决方案1】:

就您的代码 sn-p 而言,您似乎试图从登录控制器中创建一个单例,但只做了一半。

找不到序列,因为控制器是使用情节提要初始化的,而不是使用您的共享类方法。所以你最终有两个独立的实例。此外,您的类方法不会使用情节提要绑定初始化控制器,因此这里没有任何序列。

您应该尝试将 LoginController 实例的引用(初始化的 unsing storyboard segues 等)交给“其他类”并使用该类。

【讨论】:

  • 未从 NIB 加载的手动创建的 viewController 无法连接到 NIB 资源。在情节提要的上下文之外或内部重用视图控制器是不可能的。这是一个混淆点,您从情节提要加载的唯一 viewController 连接到其唯一的视图。不能重复使用,不能共享。
  • 我遇到了类似的问题。我使用的是从那里开始“dispatch_async”的 Methode 我尝试像这样使用我的 UI:“ivo_login_ViewController *loginViewController=[[ivo_login_ViewController alloc]init]; loginViewController dataProgress:@"Assignments laden" count:count];"但是我的 UI 永远不会更新,我也不能像那样启动一个新的 ViewController。我需要更改它使用正确的 NIB 资源吗? @deleted_user
【解决方案2】:
sharedLogin = [[self alloc] init];

试试这个

sharedLogin = [self.storyboard instantiateViewControllerWithIdentifier:@"xxxx"];

您必须在情节提要的 LoginViewController 中设置 IdentifierName

【讨论】:

    【解决方案3】:

    不知道你的 init 做了什么......

    我发现在尝试动态 [[alloc] init] 一个视图控制器以便像这样使用时,我不得不调用 initWithNibName:bundle:,因此我有将我的视图控制器放在一个单独的 xib 类中,这样它就不会在情节提要中混淆并留下有关无法访问场景的警告。

    没有 initWithNibName:bundle:,我猜你在 sharedLogin 中对 [[alloc] init] 的调用没有正确绑定 UIStorybardSegue* 您已经清楚地为 Login 视图控制器创建了一种可以从返回的对象中使用它的方式。

    (我的情况是我在 iPad 中有一个弹出框,在 iPhone 中有一个常规导航 segue。对于 iPhone,我在 iPhone 中使用带 segue 的隐藏按钮,但它正在对场景和视图控制器执行 segue毫无疑问会在 awakeFromNib: 中初始化:. 对于 iPad,我正在放入一个弹出框,并且弹出框没有连接到任何东西……并使用 initWithNibName:bundle: 初始化到单独的 .xib 文件中的项目。]

    【讨论】:

      【解决方案4】:

      首先,我认为 segues 应该遵循骆驼案例规则。改成...

      loginToList
      

      其次,断开并重新连接您在 ib 中的视图。

      第三,清理你的项目(shift-command-k)。

      最后,你应该使用类似这种方法的东西......

       - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
      {
          if ([[segue identifier] isEqualToString:@"loginToList"]) {
              [[segue destinationViewController] setDelegate:self];
          }
      
      }
      

      为您的转场。然后设置一个委托协议方法来关闭视图控制器。

      【讨论】:

      • 您不需要prepareForSegue,根本不需要执行segue。仅当您想在 segue 触发之前进行一些设置时才使用它。
      猜你喜欢
      • 1970-01-01
      • 2014-11-14
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      相关资源
      最近更新 更多