13

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

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

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

然而我不断得到:

 '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 自己(& )在 interfacebuilder 中创建了一个 segue(ctrl + 单击从Loginto拖动)。然后我命名了segue ,换句话说,我给了它那个标识符。我点击了segue,在右上角有一个我使用的“标识符”字段。ListLoginList"LoginToList"

我仍然收到错误说Loginhas no segue with identifier "LoginToList"。伤心

4

4 回答 4

2

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

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

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

于 2012-09-18T00:24:42.617 回答
1
sharedLogin = [[self alloc] init];

尝试这个

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

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

于 2012-06-25T04:30:32.050 回答
0

不知道你的 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 文件中的项目。]

于 2012-04-10T21:09:55.027 回答
-1

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

loginToList

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

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

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

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

}

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

于 2012-04-26T04:41:00.413 回答