我有问题,我一直坐着。我有一个UIViewController List
和一个UIViewController Login
。
在Login
我有一个按钮“完成”,同一个UIViewController上的另一个隐藏按钮有一个到List
的segue(类型:推送)。我在xcode的接口构建器中为它命名了一个名为“LoginToList”的标识符。现在从另一个类(在Login
是活动控制器时运行的类)我调用:
[[Login sharedLogin] performSegueWithIdentifier:@"LoginToList"];
Login
类显然有一个标识为"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自己(Login
&amp; List
)在界面生成器中创建了一个segue(ctrl +从Login
拖动到List
)。然后我将segue命名为"LoginToList"
,换句话说我给了它标识符。我点击了segue,在右上角有一个我用过的“Identifier”字段。
我仍然收到错误消息,指出Login
没有带标识符"LoginToList"
的segue。
悲伤
答案 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。然后设置一个委托协议方法来关闭视图控制器。