iOS 5 XCODE 4.3.2 故事板。如何在现有表视图之前插入新视图?
Posted
技术标签:
【中文标题】iOS 5 XCODE 4.3.2 故事板。如何在现有表视图之前插入新视图?【英文标题】:iOS 5 XCODE 4.3.2 Storyboard. How do I insert a new view before an existing table view? 【发布时间】:2012-05-09 23:04:15 【问题描述】:首先,我对 ios 和 Xcode 非常陌生。我已经完成了几个演示,并在开发网站上阅读了很多内容。
我当前的应用程序作为导航控制器开始 > 表格视图控制器(主视图)> 详细视图。它是表格视图中的一个基本菜单,可以深入到显示图片、价格、描述等的项目详细信息。我遵循(主要)来自 iOS 开发库“你的第二个 iOS 应用程序”https://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/SecondiOSAppTutorial/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011318-CH1-SW1 的教程 此外,我确实对布局和属性进行了一些实现更改,但最终它完美运行。
现在,事后,我决定我不喜欢应用程序的入口点是表格视图。相反,我更愿意使用其他一些按钮进入视图控制器,其中一个按钮会将您带到菜单。
我的问题如下; 我删除了导航控制器和表格视图之间的关系“根视图控制器”,然后我将它从导航控制器重新连接到我的新视图。我认为将带有 push segue 的按钮链接到旧表视图。 现在该应用程序仍然可以正常构建,但是它在运行时崩溃并出现以下错误 "-[UIViewController setDataController:]: 无法识别的选择器发送到实例 0x6a6ed60 2012-05-09 16:51:28.618 [16513:f803] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[UIViewController setDataController:]:无法识别的选择器发送到实例 0x6a6ed60” * 首先抛出调用栈:"
setter 似乎得到了一些错误的数据。所以我猜这是旧的rootview无效的问题,我真的没有足够的知识来解决这个问题。请帮忙。
抱歉,没有代表发布图片,如果需要,请告诉我,我会在某处托管。
【问题讨论】:
好的,我快接近了。我按照建议制作了 FirstViewController 类。#import "DriftMasterViewController.h" @interface FirstViewController : UIViewController @property (strong, nonatomic) MenuItemDataController *dataController;
现在界面不会崩溃,但是它不再在 tableview 中显示我的菜单项。没有看到正确的实例?
UPDATE SOLVED..我认为 所以我在我的 FirstViewController.m DriftMasterViewController *masterViewController = [segue destinationViewController]; masterViewController.dataController = self.dataController;
中添加了一个 prepareForSegue 并且一切都按预期工作.. 应该这样做还是我只是在这里黑客攻击吗?
您在那里所做的是直接从情节提要中获取控制器,如果该 segue 专门移动到您要引用的控制器,这是正确的方法。另一种方法是直接要求情节提要为您提供具有指定标识符的视图控制器(您也在情节提要的属性中设置)
【参考方案1】:
错误告诉您作为初始屏幕的 UIViewController 不知道 setDataController 的含义。您可以通过子类化 UIViewController(称为 FirstViewController 或其他东西)然后将初始视图控制器的类设置为情节提要中的该子类来解决此问题。然后,在标题中,为您的 FirstViewController 提供一个属性@property (nonatomic, strong) DataController *dataController
。可能需要更多步骤才能启动并运行它,但主要是您应该使用 UIViewController 的子类,而不是类本身的实例。
【讨论】:
感谢您的建议。我已经有一个用于 orig tableViewController 的类,所以我只是尝试将它重用为新 viewController 的类。得到新的错误。 .h@class MenuItemDataController; @interface DriftMasterViewController : UITableViewController @property (strong, nonatomic) MenuItemDataController *dataController;
NSInternalInconsistencyException 原因:[UITableViewController loadView] 加载了 nib 但没有得到 UITableView
我认为问题出在我的 appdelagate.m 你能在其他答案中看到我的 cmets 吗?【参考方案2】:
返回上一个以表格视图为根的版本。只需在故事板上拖动一个新的 viecontroller 即可。然后你会看到一个指向 table view 的箭头,把那个箭头拖到新的 viewcontroller 上。
【讨论】:
是的,这是我首先尝试的,我无法在 xcode 4.3.2 中拖动箭头我必须删除它并制作另一个 “我删除了关系“根视图控制器”在导航控制器和表格视图之间,然后我将它从导航控制器重新连接到我的新视图。” 这样做就是导致错误的原因。 您没有使用情节提要吗?你可以在属性检查器中直接将任意视图声明为初始视图控制器,从右到左第三个选项卡,有一个“是初始视图控制器”。我想我明白你的意思,当你添加表格视图时,它可能带有另一个连接到表格视图的视图控制器,对吗?在同一个属性检查器上,您可以在连接上找到表示委托和数据源或类似内容的连接,只需将它们指向现在将管理您的方法的正确实例。 我很确定你所描述的是我从一开始就做的事情,这是一张图片link 我认为问题出在我的 appdelegate.m 中,因为在我添加之前新的视图控制器,导航控制器将返回它的根视图控制器,即表视图,现在它返回 UIViewController。在firstViewController.dataController = aDataController;
行中,firstviewcontroller 是 UIViewcontroller,而不是 tableviewcontroller。我该如何解决这个问题?
在你给我的图片中,就行了 //try。类型 NSLog(@"%@",firstViewController);控制台的输出是什么?
导航控制器包含一个视图控制器数组,您遇到的问题是因为对象索引 0 ([[navigationController viewControllers] objectAtIndex:0]) 处的任何内容都不是您期望的类型,所以它没有你要求的方法,并且抛出异常,通过使用 NSLog 你可以看到你得到什么样的控制器。当您执行此操作 (DriftMasterViewController *) 时,您正在转换结果,因此您告诉 xcode 该索引处的对象是该类型的对象。您可以使用 for 循环 nslog 堆栈中的所有对象以查看您在那里得到了什么。以上是关于iOS 5 XCODE 4.3.2 故事板。如何在现有表视图之前插入新视图?的主要内容,如果未能解决你的问题,请参考以下文章
在 Xcode 5 中修改故事板后如何同步本地化故事板的字符串
如何创建一个向后兼容iOS 5.0的新Xcode 5项目? - 错过故事板错误
带有 iOS 7 的 Xcode 5 中的 NSInternalInconsistencyException:“故事板:容器视图中有意外的子视图。”
如何在 Xcode 11 中启动没有故事板 >= iOS 13 的新项目?
在Xcode 5.0.1(更新的xcode 6)中为3.5,4.0(更新的4.7和5.5)英寸屏幕开发相同的UI,没有风景,没有iPad,没有故事板