iOS和Xcode:在UITableView中设置委托和数据源时出现不兼容的类型错误

时间:2013-12-27 05:27:28

标签: ios xcode uitableview incompatibletypeerror

我正在尝试以编程方式创建一个包含UITableView的应用程序,该应用程序根据应用程序的Documents目录中的文件生成项目列表。我已经能够将文件读入数组_filepathsArray,但是当我尝试使用数组填充表时,编译崩溃并且Xcode抛出警告。 Xcode指出了以下几行的问题:

_tableView.delegate = self;
_tableView.dataSource = _filepathsArray;

这两者都引发了“语义问题”。第一次投掷

`Assigning to 'id<UITableViewDataSource>' from incompatible type 'NSArray *__strong'`,

而第二次抛出

`Assigning to 'id<UITableViewDelegate>' from incompatible type 'BrowserViewController *const __strong'`.

如果删除这些行,应用程序将正确编译(但当然不会使用数据填充表格),所以我认为问题与这些有关。

我是Objective C和Xcode的初学者,所以我无法弄清楚我在这里做错了什么。谢谢你的帮助。

更新

我已将行_tableView.dataSource = _filepathsArray;更改为_tableView.dataSource = self;,如以下几个答案所述。现在,两行都抛出相同的错误:

`Assigning to 'id<UITableViewDelegate>' from incompatible type 'BrowserViewController *const __strong'`.

此错误可能是视图控制器配置方式的结果吗?在头文件中,它被定义为UIViewController

@interface BrowserViewController : UIViewController

然后我将UITableView包含为子视图。

3 个答案:

答案 0 :(得分:9)

您应该声明一个UITableViewDataSource,这是一个实现该协议并向您的表提供数据的对象。

_tableView.dataSource = self;

来自Apple Docs

dataSource
The object that acts as the data source of the receiving table view.
@property(nonatomic, assign) id<UITableViewDataSource> dataSource
Discussion
The data source must adopt the UITableViewDataSource protocol. The data source is not retained.

更新:请根据我应该声明UITableViewDataSource的答案的第一行定义您的课程如下:

@interface BrowserViewController : UIViewController <UITableViewDataSource,UITableViewDelegate>

答案 1 :(得分:1)

_tableView.dataSource = _filepathsArray; //&lt; - 这是问题,因为它的类型是控制器而不是数组,

// add this to your interface
@interface BrowserViewController : UIViewController <UITableViewDataSource,UITableViewDelegate>

因为您目前尚未确认UITableView协议

总是像

一样使用它
_tableView.delegate = self;
_tableView.dataSource = self;

并且您的_filepathsArray将在numberofRows委托中用于获取行数,而cellForRowIndexPath用于显示数据,如

cell.titleLabel.text = _filepathsArray[indexPath.row];

答案 2 :(得分:1)

您收到这些警告是因为您没有声明要在要作为数据源和委托的对象的.h文件中实现数据源和委托方法。通常,这将是UITableViewController或UIViewController的子类,尽管实现协议的任何对象都可以是数据源或委托。 UITableViewController已经符合这两个协议,所以你不需要声明任何东西,但是如果你使用的是UIView控制器,你应该把这个(尽管它不是绝对必要的)放在.h文件中:

@interface YourCustomClassName : UIViewController <UITableViewDataSource,UITableViewDelegate> 

在.m文件中,你应该将self设置为数据源和委托(同样,这是通常的模式,但是一个对象不必同时提供这两种角色):

self.tableView.delegate = self;
self.tableView.dataSource = self;