实例化视图控制器(instantiateViewControllerWithIdentifier)-故事板ID已设置但仍无法工作

27

我需要以编程方式创建segue,但是当我点击按钮时,视图控制器不会更改为下一个,Storyboard ID已设置但仍无法工作。我是否漏掉了其他检查以使其正常工作?

请参见下面的代码:

EntryViewController *entryController = [self.storyboard instantiateViewControllerWithIdentifier:@"go"];
[self.navigationController pushViewController:entryController animated:YES];

这让我发疯了。谢谢。


2
'self.storyboard' 是被设置了还是为 nil? - Wain
@Wain 可能被设置为 nil,因为我还没有进行设置,在哪里可以将 storyboard 设置为 self? - user2366782
6个回答

35

在我的viewDidLoad方法中,我放置了一个按钮,该按钮调用了goldStarOpen方法:

UIButton *btnTwo = [UIButton buttonWithType:UIButtonTypeCustom];
btnTwo.frame = CGRectMake(250, 20, 40, 40);
[btnTwo addTarget:self action:@selector(goldStarOpen) forControlEvents:UIControlEventTouchUpInside];
[btnTwo setImage:[UIImage imageNamed:@"GoldStar.png"] forState:UIControlStateNormal];
[self.view addSubview:btnTwo];

在goldStarOpen中,我有几乎和你的代码完全相同的部分。

- (void)goldStarOpen
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:
                                @"MainStoryboard" bundle:[NSBundle mainBundle]];
    UIViewController *myController = [storyboard instantiateViewControllerWithIdentifier:@"GoldStar"];
    [self presentViewController:myController animated:YES completion:nil];
}

goldStarOpen在故事板中激活一个视图控制器。

您可能需要设置要加载的视图控制器的Storyboard ID。这位于检查器中,就在您为视图控制器分配自定义类的下方。

enter image description here


我曾经遇到过同样的问题,我通过在检查器中设置类的正确模块来解决它(请参见上面的截图)。 - chris
有人能回答这个问题吗?http://stackoverflow.com/questions/38959445/astoryboard-instantiateviewcontrollerwithidentifiermyid-returns-nil-but-not?noredirect=1#comment65274351_38959445 - harmeet07

6

使用

 + (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(NSBundle *)storyboardBundleOrNil. 

所以试一下这个

self.storyboard=[UIStoryboard storyboardWithName:@"Your_Story_Board_Name" bundle:[NSBundle mainBundle]];
EntryViewController *entryController = [self.storyboard instantiateViewControllerWithIdentifier:@"go"];
[self.navigationController pushViewController:entryController animated:YES];

我使用这个答案在AppDelegate中实例化了Storyboard。谢谢! - Boris Nikolic

4

试试这个:在Xcode中选择UIViewController->Editor->Embed In->Navigation Controller

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"YourStoryboard"
                                                         bundle: nil];

YourViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier: @"YourViewController"];
[self.navigationController pushViewController:vc animated:YES];

2

试试这个:

 UIStoryboard *    storyboardobj=[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

 EntryViewController *entryController = [storyboardobj instantiateViewControllerWithIdentifier:@"go"];
[self.navigationController pushViewController:entryController animated:YES];

我之前看到了另一个类似的例子,刚刚尝试了你的代码但仍然没有成功。 - user2366782

0

你不能设置视图控制器的storyboard。它是只读的,并且在视图控制器创建时设置。相反,您需要从其他地方获取或加载故事板。

您可以从AppDelegate的根视图控制器中获取故事板。或使用+(UIStoryboard *)storyboardWithName:(NSString *)name bundle:(NSBundle *)storyboardBundleOrNil


它没有跳转到下一个视图控制器。 - user2366782
你确认故事板是通过调用 'storyboardWithName:...' 创建的吗?视图控制器是否为 'go' 标识符实例化?当前视图是否在导航控制器中? - Wain
是的,我正在使用名为'mainStoryboard'(注意小写的m)的故事板。唯一的问题是,尽管我的视图控制器嵌入了一个导航控制器,但当我在模拟器中运行它时,顶部没有出现导航栏。您认为这是个问题吗? - user2366782
你能展示一下原始控制器的代码吗?在调试时,导航控制器是否为空? - Wain
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/31741/discussion-between-wain-and-teddyc - Wain
显示剩余2条评论

0
今天遇到了这个问题,清楚地在右侧面板上设置了Storyboard ID,但仍然收到警告,说VC无法访问且没有设置标识符。在取消“从目标继承模块”框中的选中状态并运行项目后,问题得以解决。

enter image description here

代码成功运行后,似乎无论是否选中框都可以正常工作,因此可能是Xcode的错误... 不管怎样,希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接