使用 setDataSource 升级到 Xcode 4.6 后出现编译器错误

Posted

技术标签:

【中文标题】使用 setDataSource 升级到 Xcode 4.6 后出现编译器错误【英文标题】:Compiler error after upgrading to Xcode 4.6 using setDataSource 【发布时间】:2013-08-20 16:28:36 【问题描述】:

我正在升级一些项目以使用 Xcode 4.6 和 Clang LLVM 编译器,但我遇到了一个错误。我不是最大的 obj-c 极客,所以我有点卡在这里。我认为这个question 触及了我的问题的基础,但并没有给我一个解决方案。

我的类派生自 NSTableView (@interface MyClass : NSTableView) 但当我进行以下调用时:

[self setDataSource:self];

我收到以下错误:

Cannot initialize a parameter of type 'id<NSTableViewDataSource>' with an lvalue of type 'MyClass *'

使用 Xcode 3.2.6 并没有遇到此调用的问题,但现在我很难理解为什么会出现错误。我确实在此调用之前添加了一些表列并设置了一些属性,但基本上我从上面的调用中得到了错误。

感谢任何帮助。

【问题讨论】:

你的类似乎没有实现数据源协议。 【参考方案1】:

首先,您的表格视图应该是它自己的数据源。这打破了 Cocoa 使用的MVC model。视图应该只关心显示/呈现数据,它不应该存储数据(这是模型的工作),也不应该是视图与模型接口的类(这是控制器的工作)。

通常,数据源将是符合NSTableViewDataSource 和协议的NSViewController

@interface MyViewController : NSTableViewController <NSTableViewDataSource, NSTableViewDelegate>

【讨论】:

是否可以在不添加新类和接口的情况下做到这一点? 至少,您必须实现NSTableViewDataSource 协议。不过,我非常建议重构您的架构。它目前已损坏,使您的代码的可重用性降低,并且难以调试和单独测试。与其让它溃烂,不如现在就把它扼杀在萌芽状态。 感谢您的 cmets! :)

以上是关于使用 setDataSource 升级到 Xcode 4.6 后出现编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

MediaPlayer.setDataSource(String) 不适用于本地文件

如何使用 Kendo UI Grid 的 SetDataSource 方法

Android:MediaPlayer.setDataSource(FileDescriptor fd) vs MediaPlayer.setDataSource(FileDescriptor fd,

水晶报表 - objRpt.SetDataSource()

获取 mediaMetadataRetriever.setDataSource 抛出非法参数异常

Android中setDataSource()方法