卡在 initWithNibName
Posted
技术标签:
【中文标题】卡在 initWithNibName【英文标题】:Stuck with initWithNibName 【发布时间】:2012-07-13 22:39:55 【问题描述】:我使用情节提要创建了一个应用程序。有两个视图控制器第一个视图或初始视图是 UnifeyeMobileViewController,第二个视图控制器称为 SecondViewController。两者都通过导航视图控制器内的 segue 连接。 SecondViewController 有两个按钮。在 secondViewController 内第一个按钮的 IBAction 上,我正在尝试运行以下代码。
我正在尝试在以前版本的 xcode 中使用现有应用程序中的以下代码,我们使用 XIB 而不是情节提要,但以下代码不适用于情节提要,它会在 presentModelViewController 语句中生成错误消息。
UnifeyeMobileHelloWorld* unifeyeMobileViewController = [[UnifeyeMobileHelloWorld alloc] initWithNibName:@"UnifeyeMobileViewController" bundle:nil];
unifeyeMobileViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[viewController presentModalViewController:unifeyeMobileViewController animated:YES];
[unifeyeMobileViewController release];
UnifeyeMobileHelloWorld 是我在这里以编程方式生成的视图控制器。从文件->新建->文件->UIViewController的objective C类子类导入UIController类。将此文件命名为UnifeyeMobileHelloWorld。并在实现文件中添加功能。
【问题讨论】:
调试控制台的错误是什么? 另外,你是否导入了xib文件UnifeyeMobileViewController
?
什么是视图控制器?在使用 presentModalviewcontroller 时
@ctrahey:它会生成错误,说使用未声明的变量“viewController”,你的意思是“UIViewController”。如果使用语句为 [ self presentModelViewController:unifeyeMobileViewController animated:YES];然后我的输出控制台显示:
2012-07-14 04:54:25.643 MyAr[949:10a03] -[SecondViewController btnHelloWorld:]:无法识别的选择器发送到实例 0x7d3e9b0 2012-07-14 04:54:25.646 MyAr[949 :10a03] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[SecondViewController btnHelloWorld:]:无法识别的选择器发送到实例 0x7d3e9b0”
【参考方案1】:
所以您正在尝试创建从第二个视图控制器到第一个视图控制器的模态转场?只有一个 segue 会更有意义,从第一个 (UnifeyeMobileHelloWorld) 到第二个的模态。然后当有人点击你想发回他们的按钮时,你可以调用
[self dismissModalViewControllerAnimated:YES];
//如果你愿意,也可以不
不确定这是否适合您应用的其余设计,如果您在第二个之后有更多视图,请将其作为从 UnifeyeMobileHelloWorld 到第二个的推送 segue,顶部的导航栏将有自动返回按钮。
【讨论】:
这不是提问者想要完成的(除非我严重误解了)。请注意,“第一个”VC 是UnifeyeMobileViewController
,第二个是SecondViewController
,而我们试图以编程方式访问的那个是UnifeyeMobileHelloWorld
对不起。请评论或发布更详细的错误,以便我提供帮助。也许是你故事板的截图?
@ctrahey: 是的,你是对的,这就是我在这里想要做的,请指教【参考方案2】:
编辑:无操作方法:
您在上面的 cmets 中粘贴的错误表明问题实际上出在其他地方。您按下的按钮被配置为使用选择器向 SecondViewController 发送消息:btnHelloWorld:
,而 SecondViewController 没有该选择器的方法。如果您重命名方法并且不将故事板中的按钮重新连接到新方法,则可能会发生这种情况。所以打开情节提要,然后从按钮重新ctrl-拖动到SecondViewController中适当的动作方法。
原答案:
看来(通过我们上面的对话),您需要复制 XIB 文件,或者将 XIB 的内容移动到您的故事板并使用更现代的过渡技术(即拖放转场过渡)。
要以您尝试的方式使用视图控制器,它需要 3 个文件:
-
.h
.m
.xib(或 .nib)
您的情况似乎缺少#3。需要它来布局 ViewController 的子视图并初始化它们的连接,至少,因为您正在调用 'initWithNibName:`,所以需要它,这需要一个 *ib 文件
【讨论】:
它说 initWithNibName:@"UnifeyeMobileViewController" 已经作为第一个视图控制器出现在故事板上。 UnifeyeMobileHelloWorld.h 和 UnifeyeMobileHelloWorld.m 文件只是我的应用程序中的文件,其中包含为视图控制器编写的代码,因此我以编程方式链接 UnifeyeMobileViewController.UnifeyeMobileHelloWorld* unifeyeMobileViewController = [[UnifeyeMobileHelloWorld alloc] initWithNibName:@ "UnifeyeMobileViewController" bundle:nil]; 这样不行。如果你的 storyboard 中有那个类的 ViewController,你不能用 alloc/initWithNibName 加载它,你需要用[self.storyboard instantiateViewControllerWithIdentifier:@"someIDFromXcode"];
加载它
但还要注意错误指示其他内容;查看此答案的最新编辑。以上是关于卡在 initWithNibName的主要内容,如果未能解决你的问题,请参考以下文章