实现自定义 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 类并避免委托警告的主要内容,如果未能解决你的问题,请参考以下文章