UITableView无法识别的选择器发送到实例(我个人从未发送过)

时间:2014-03-06 18:10:43

标签: ios objective-c

我不明白为什么这段代码

[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

3 个答案:

答案 0 :(得分:5)

问题在于:

[self.tableview setDataSource:self.dataSource];

我认为self.dataSourceNSArray,应该再次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.dataSourceNSMutableArray。它应该是一个实现UITableViewDataSource协议的对象。