NSInvalidArgumentException原因Receiver没有带标识符的segue

时间:2012-03-05 14:10:29

标签: objective-c xcode segue uistoryboardsegue

我有问题,我一直坐着。我有一个UIViewController List和一个UIViewController Login。 在Login我有一个按钮“完成”,同一个UIViewController上的另一个隐藏按钮有一个到List的segue(类型:推送)。我在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我不知道我是否遗漏了一些愚蠢的东西,但我无法发现它:(

编辑:我已经使用UIViewControllers自己(Login&amp; List)在界面生成器中创建了一个segue(ctrl +从Login拖动到List)。然后我将segue命名为"LoginToList",换句话说我给了它标识符。我点击了segue,在右上角有一个我用过的“Identifier”字段。

我仍然收到错误消息,指出Login没有带标识符"LoginToList"的segue。 悲伤

4 个答案:

答案 0 :(得分:2)

就你的代码片段而言,看起来你试图从登录控制器中创建一个单例,但只做了一半。

无法找到seque,因为Controller是使用故事板初始化的,而不是使用您的共享类方法。所以你最终有两个独立的实例。此外,您的类方法不会使用故事板绑定初始化控制器,因此您在此处没有任何seques。

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

答案 1 :(得分:1)

sharedLogin = [[self alloc] init];

试试这个

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

您必须在storyboard LoginViewController中设置IdentifierName

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:-1)

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

loginToList

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

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

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

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

}

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