iPhone 子类化视图控制器和 IBOutlet UITableView
Posted
技术标签:
【中文标题】iPhone 子类化视图控制器和 IBOutlet UITableView【英文标题】:iPhone Subclassing view controller and IBOutlet UITableView 【发布时间】:2011-02-07 13:08:38 【问题描述】:我有以下问题。我已经创建了一个与上面非常相似的 ViewController
@interface MyViewController : UIViewController
IBOutlet UITableView *myTableView;
@property (nonatomic, retain) IBOutlet UITableView *myTableView;
我已将 Interface Builder 上的 myTableView 链接到匹配的 nib 的 UITableView。我已经将 MyViewController 子类化为这样创建 YourViewController:
@interface YourViewController : MyViewController
然后我从 TabBarController 加载选项卡项上的 YourViewController。虽然我可以看到最后确实调用了MyViewController,但是模拟器上并没有显示table view。
我已尝试调试 MyViewController,但似乎 IBOutlet 为 nil。
为什么会这样?
【问题讨论】:
【参考方案1】:我在继承、IBOutlets 和 IBAction 方面遇到了重大问题。我建议您避免这种情况,并以另一种方式创建共享内容。
例如,当我收到内存警告时,我受到了严重的错误打击。在基类和派生类中定义插座和操作时,它们没有正确重新连接。
【讨论】:
你对如何实现这个有什么建议吗?我所有的子类都在做与 MyViewController 完全相同的事情,唯一改变的是在每个子类上检索数据的方式。我有一种感觉,和initCoder有关:这应该是一个标准的子类化场景…… 好吧,我会把所有繁重的工作都放在基类中,并且尽可能地在派生类中有出口和动作。【参考方案2】:可能 MyViewController 的 nib 文件根本没有加载。您是否为 YourViewController 使用特定的 nib 文件?以及您以哪种方式创建 YourViewController。
你也可以尝试在 YourViewController 中定义一个“awakeFromNib”方法,然后从中调用 [super awakeFromNib] 吗?
但是,要了解您的问题,您必须清楚地说明您如何加载对象以及是否以及在何处使用 Nib?
【讨论】:
我认为你在这里是正确的。 YourViewController 正在通过 nib 加载。 (它被指定为选项卡栏项的 NIB)如果我使用 initWithNibName 加载 YourViewController,它可以正常显示 MyViewController 的 NIB。但是,当从 TabBar Nib 加载时,它不会显示任何内容。我已经按照您的建议尝试了 awakeFromNib,但仍然没有任何结果..【参考方案3】:如果您使用代码动态添加它,那么只有它会起作用。不使用笔尖。
【讨论】:
没有办法通过 Nib 加载吗?即使我们覆盖 initWithCoder: 让我们说? 所以我尝试重载 initWithCoder 来调用 initWithNibName 并且它确实有效,尽管现在导航控制器似乎存在问题不切换视图......总有我想的解决方案复制笔尖并将YourController分配为文件所有者并从标签栏加载该笔尖...【参考方案4】:UITableView
(即您的 myTableView)需要数据源及其控制的委托。
而且您的控制器需要指向 xib 中的 Table 视图的链接。
在控制器的接口部分声明表委托协议。
使用 IB,将 xib 中的 TableView 链接到所有者文件:委托。
使用IB,将文件所有者myTableView链接到xib中的tableView。
我希望它会有所帮助。
【讨论】:
你在你提到的事情上是对的。我已经完成了这些,但为了简单起见,我没有提到它。问题仍然存在。【参考方案5】:假设您在 MainWindow.xib 中有整个导航堆栈
打开 MainWindow.xib 选择 YourViewController(或任何你调用 UITableViewController 子类的控制器) 选择属性检查器 确保“NIB 名称”属性选择了正确的 YourViewController(或任何名称)我遇到了同样的问题,这为我解决了。
【讨论】:
以上是关于iPhone 子类化视图控制器和 IBOutlet UITableView的主要内容,如果未能解决你的问题,请参考以下文章
Swift 中的 UIView 子类:IBOutlet 在展开时发现为零