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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 IBOutlet 子类化变量?

Swift 中的 UIView 子类:IBOutlet 在展开时发现为零

表格视图单元子类中的 UIImageView 不能作为 IBOutlet 工作

iOS:Xcode 6 中的 IBOutlet 为零

从多个故事板子类化 UIViewController

iPhone XCode 编程:从导航视图调用的视图未设置其 IBOutlet 属性