我不明白为什么这段代码
[self.tableview setDelegate:self];
[self.tableview setDataSource:self.dataSource];
NSFileManager* filemanager= [[NSFileManager alloc] init];
NSError * error = nil;
NSString* path = @"/Users/luci/Desktop";
_dataSource = [filemanager contentsOfDirectoryAtPath:path error:&error];
给我'NSInvalidArgumentException',原因:' - [__ NSArrayM tableView:numberOfRowsInSection:]:无法识别的选择器发送到实例0x8e445b0' 其中dataSource是NSArray,tableview是UITableView
答案 0 :(得分:5)
问题在于:
[self.tableview setDataSource:self.dataSource];
我认为self.dataSource
是NSArray
,应该再次self
。
问题是UITableView
调用了选择器(方法)tableView:numberOfRowsInSection
,这应该由数据源实现,该数据源应该是您的UIViewController
,因为它是委托。
可能的解决方案是:
[self.tableview setDataSource:self];
即self
实施UITableViewDataSource
协议。
答案 1 :(得分:1)
正如HitLicks所指出的,您使用NSMutableArray
作为UITableView
的数据源。这是错的。 UITableView
的数据源对象必须符合UITableViewDataSource
。
UITableViewDataSource
的文档可用here。
您的数据源对象必须实现两种方法:tableView:numberOfRowsInSection:
和tableView:cellForRowAtIndexPath:
您不会在代码中调用它们 - 它们将由UITableView在其数据源对象上调用。
示例:
@interface YourController
@property (strong, nonatomic) NSArray *data;
@end
@implementation YourController<UITableViewDataSource, UITableViewDelegate> //this is important as it will prevent from compiler's warnings
//somewhere in code - probably viewDidLoad
[self.tableview setDelegate:self];
[self.tableview setDataSource:self];
NSFileManager* filemanager= [[NSFileManager alloc] init];
NSError * error = nil;
NSString* path = @"/Users/luci/Desktop";
self.data = [filemanager contentsOfDirectoryAtPath:path error:&error];
#pragma mark - UITableViewDataSource
- (NSInteger)numberOfRowsInTableView:(UITableView *)tableView
{
[return self.array count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForIndexPath:(NSIndexPath *)indexPath
{
id object = self.data[indexPath.row];
//create your cell here
return cell;
}
@end
答案 2 :(得分:0)
似乎self.dataSource
是NSMutableArray
。它应该是一个实现UITableViewDataSource
协议的对象。