实现自定义 UITableViewController 类并避免委托警告

Posted

技术标签:

【中文标题】实现自定义 UITableViewController 类并避免委托警告【英文标题】:Implementing custom UITableViewController class and avoiding delegate warnings 【发布时间】:2012-02-02 21:04:31 【问题描述】:

我正在尝试在UIViewController 中制作我自己的UITableViewController 版本(以进行更多自定义)。所以在我的超类中,我同时实现了委托和数据源,并将UITableView 对象委托和数据源属性设置为“this”。唯一的问题是我收到一个编译器警告,抱怨我没有实现强制的 dataSource 和委托方法。当我将自定义UITableViewController 子类化时,我希望能够实现这些方法。

有没有一种巧妙的方法可以让这些警告消失,或者是我放置强制委托方法的空版本,然后在子类中覆盖它们的唯一方法?这是不好的做法吗?任何人都对 Apple 如何通过 UITableViewController 类实现这一点有任何见解?

【问题讨论】:

您能否详细说明“更多定制”是什么意思?也许有比制作自己的“UITableViewController”版本更好的方法来做你想做的事 嗯,重要的是我希望它继承 UIViewController 类,该类设置了我所有的应用程序视图控制器。 你可以在 UIViewController 中设置 UITableView 没有问题,你不需要 UITableViewController 这正是我正在做的,我正在 UIViewController 中实现我自己的“UITableViewController”。我不是从 UITableViewController 继承的,只是想模仿它。 好吧,那么如果你正在实现委托和数据源,你必须遵守协议的要求并添加必要的方法......你不会逃脱空方法 【参考方案1】:

我将此模式用于“抽象”方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    [self doesNotRecognizeSelector:_cmd];
    abort();

_cmd 变量是当前方法的选择器。它是自动提供的,就像self

您必须调用abort(),因为编译器知道abort() 不会返回,但它不知道doesNotRecognizeSelector:

至少在 ios 5 中,UITableViewController 方法不是空的,因为UITableViewController 支持从情节提要加载预定义(静态)行。

【讨论】:

谢谢。只是好奇但实现了您的抽象模式,与只是将方法留空相比,这样做的目的是什么?如果它是用户可以调用的方法,我会更理解它,但是委托方法只会由系统/委托调用。或者也许我遗漏了一些东西,如果你能解释一下,将不胜感激。 好的我想我明白你为什么这样做了,以防止它触发返回值的警告。如果该方法没有返回值,您会直接将其留空,或者做其他事情吗? 有可能(虽然很少)覆盖doesNotRecognizeSelector: 来返回,所以我总是使用abort() 该模式的目的是在程序员未能覆盖所需方法时引发错误。在编译时给出错误会很好,但这在 Objective-C 中是不可能的。因此,如果程序员未能覆盖其子类中的方法,则此模式会在运行时产生错误。错误消息可能不是最好的消息,但它确实包含子类的名称和需要重写的方法。 你能接受编辑,而不是我给你的答案吗?只是稍微解释一下。

以上是关于实现自定义 UITableViewController 类并避免委托警告的主要内容,如果未能解决你的问题,请参考以下文章

自定义注解实现解密+单个属性解密

织梦cms如何实现自定义表单字段的查询

QT如何实现自定义下拉列表

如何传回数据[重复]

自定义控件(仿PopupWindow篇)

自定义控件(仿PopupWindow篇)