【问题标题】:UITableViewDataSource Done Loading Signal to UITableViewDelegateUITableViewDataSource 完成向 UITableViewDelegate 加载信号
【发布时间】:2011-04-05 22:24:38
【问题描述】:

我有 UITableViewDataSourceUITableViewDelegate 的单独文件

我正在 UITableView 上实现“下拉​​刷新”功能,并希望从 UITableViewDataSourceUITableViewDelegate 发送信号以阻止加载指示器转动.

我想知道在 UITableViewDataSourceUITableViewDelegate 之间发送信号的最佳方式是什么,或者是否有更好的方法来构建它,因为我觉得我'正在打破一些抽象障碍。

我在数据源中有什么:

if([tableView.delegate respondsToSelector: @selector(dataSourceDidFinishLoadingNewData)]){
    [tableView.delegate dataSourceDidFinishLoadingNewData];
}

但我在协议警告中找不到“dataSourceDidFinishLoadingNewData”,因为我猜该函数未声明为 UITableViewDelegate

的方法

【问题讨论】:

  • 你只是为数据源和委托使用一个控制器吗?我不会太担心将两者混合在一起。几乎已经感觉它们是一回事(实际上在任何 UITableViewController 子类中,它们都是)。
  • 在我当前的设置下,我在一个视图控制器下有两个 UITableView,所以我有两个数据源和一个委托 - 所以我宁愿保留单独的文件

标签: iphone objective-c uitableview


【解决方案1】:

只是一个侧面的答案;使用时:

if([object respondsToSelector:@selector(someMethod)]){
    [object someMethod];
}

范式,你可以改用这个:

if([object respondsToSelector:@selector(someMethod)]){
    [object performSelector:@selector(someMethod)];
}

可能有点长,但不会给你任何警告。

【讨论】:

  • 这是因为 performSelector 只知道在运行时调用了什么方法。这意味着在编译期间,它无法检测某个消息是否在界面中列出。这是一把双刃剑。
【解决方案2】:

也许您知道,但有多个拉动刷新的开源实现。你可能想在自己制作之前先研究一下。这是一个(只是 Google 上的第一个):http://github.com/leah/PullToRefresh

【讨论】:

【解决方案3】:

在保持事物完全抽象的同时,您可能无法做到这一点。通过 tableViews 委托属性调用委托的另一种方法是交换保留引用。但是,您甚至可以通过使用通知向代理发出加载已完成的信号来避免保持对其他对象的引用。

查看NSNotificationCenter了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多