tableView:numberOfRowsInSection:]:发送到实例的无法识别的选择器

时间:2012-09-14 19:45:18

标签: ios xcode uitableview delegates

我有一个奇怪的问题。我收到这个错误:

 -[FourSquareCheckInViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x7aecc0
2012-09-14 19:18:39.039 [5869:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[FourSquareCheckInViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x7aecc0'
*** First throw call stack:
(0x3545e88f 0x37805259 0x35461a9b 0x35460a83 0x353bb650 0x32ee3693 0x32ee49ed 0x32ee493f 0x32ee451b 0x32ef17df 0x32ef16af 0x32e95f37 0x353bd1fb 0x3228daa5 0x3228d6bd 0x32291843 0x3229157f 0x322894b9 0x35432b1b 0x35430d57 0x354310b1 0x353b44a5 0x353b436d 0x37050439 0x32ec0cd5 0xb7ebb 0xb7e60)
terminate called throwing an exception(lldb) 

好的,所以我确保将ViewController设置为dataSource和Delegate。我已将UITableViewDelegate和UITableViewDataSource添加到<>一样的东西。

我在viewDidLoad方法中设置了tableView.delegate = self和tableView.dataSource = self。

这是我对viewDidLoad和viewDidAppear方法的实现:

- (void)viewWillAppear:(BOOL)animated{
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer; // 1km
    [locationManager startUpdatingLocation];
    locationLat = [locationManager location].coordinate.latitude;
    locationLng = [locationManager location].coordinate.longitude;
    [locationManager stopUpdatingLocation];

    // 1
    CLLocationCoordinate2D zoomLocation;
    zoomLocation.latitude = locationLat;
    zoomLocation.longitude= locationLng;
    // 2
    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 0.5*METERS_PER_MILE, 0.5*METERS_PER_MILE);
    // 3
    MKCoordinateRegion adjustedRegion = [_mapView regionThatFits:viewRegion];                
    // 4
    [_mapView setRegion:adjustedRegion animated:YES]; 
}

- (void)viewDidLoad
{
    [super viewDidLoad];

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

    // Do any additional setup after loading the view.
    // 1
    MKCoordinateRegion mapRegion = [_mapView region];
    CLLocationCoordinate2D centerLocation = mapRegion.center;

    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer; // 1km
    [locationManager startUpdatingLocation];
    locationLat = [locationManager location].coordinate.latitude;
    locationLng = [locationManager location].coordinate.longitude;
    [locationManager stopUpdatingLocation];

}

这是我的numberOfRowsInSection方法体:

- (NSInteger)numberOfRowsInSection:(NSInteger)section{
    return 5;
}

这是我的视图控制器的头文件:

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

#define METERS_PER_MILE 1609.344

@interface FourSquareCheckInViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, CLLocationManagerDelegate, MKMapViewDelegate>{

}


@property (weak, nonatomic) IBOutlet MKMapView *_mapView;

- (NSInteger)numberOfRowsInSection:(NSInteger)section;
@property (weak, nonatomic) IBOutlet UITableView *_tableView;



@end

这是一个屏幕截图,显示我的tableView如何连接:

enter image description here

10 个答案:

答案 0 :(得分:32)

阅读错误消息告诉您的内容!

您已实施numberOfRowsInSection:。所以呢?那是错误的方法。这是无关紧要的。永远不会被召唤。

您需要实施的方法称为tableView:numberOfRowsInSection:。那是完全不同的。

答案 1 :(得分:27)

I had delegate and datasource hooked up to the TableView

如果单击视图,它应在INSPECTOR中显示上述连接。 如果你还没有连接ViewController,你将收到错误:

  

'NSInvalidArgumentException',原因:' - [UIView   tableView:numberOfRowsInSection:]:发送到的无法识别的选择器   实例

我是如何停止错误的

  1. 按下ViewController选择它
  2. 在右侧连接检查器中查找引用插座
  3. New Referencing Outlet 的圆圈拖动到视图
  4. 当您释放鼠标时,会显示一个小弹出窗口 - 选择 datasource
  5. 重复步骤3,这次选择委托
  6. 完成后,它应该如下图所示!

    Referencing outlet Datasource and delegate connected to view

    这为我停止了上述错误。 我希望这有助于某人。

答案 2 :(得分:11)

如果您已经在视图控制器中正确地连接了所有内容,那么您也会看到此错误,您忘记在故事板中分配自定义视图控制器类:

Enter your custom view controller in identity inspector

答案 3 :(得分:7)

检查是否在类文件中定义了UITableViewDelegate,UITableViewDataSource:

class ClassName: UIViewController, UITableViewDelegate, UITableViewDataSource  
{

}

答案 4 :(得分:4)

这很简单,我遇到了类似的问题。我在我的ViewController中实现了没有Storyboard的TableView,它的子类UIViewController包含两个协议:<UITableViewDataSource, UITableViewDelegate>

但是如果你看UITableViewDataSource,有两种方法是@required,你需要在你的代码中实现这些方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

UITableViewDelegate中的所有其他方法都是@optional,因此您无需实现它们。

答案 5 :(得分:4)

如果尽管您已正确地将所有内容连接到视图控制器中,但又忘记扩展UITableViewDelegate,UITableViewDataSource,您也会看到此错误。

答案 6 :(得分:2)

- (NSInteger)numberOfRowsInSection:(NSInteger)section;

您没有实现UITableViewDataSource方法。删除声明,它不会再崩溃。或者为它提供一个方法体。

答案 7 :(得分:1)

我认为显示此答案很重要。这似乎很愚蠢,也许是这样,但是我花了好一会儿才看到错误。

碰巧我创建了一个新视图并复制了部分代码。

我创建了新视图:

class THIRD: UIViewController {

[...]

}

然后我开始复制代码:

func numberOfSections(in tableView: UITableView) -> Int {
...
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
...
}

等等。

然后,出现消息错误:

[Fonts.THIRD tableView:numberOfRowsInSection:]:无法识别的选择器已发送到实例0x10204b200

我一次又一次地检查了情节提要。我一次又一次地检查代码。而且我也度过了美好的时光。

最后我意识到了!

我忘了声明:

class THIRD: UIViewController, UITableViewDelegate, UITableViewDataSource {

可能是错误的原因,请不要声明 UITableViewDelegate UITableViewDataSource 协议

记住它,不要忘记它!

答案 8 :(得分:1)

我发现此错误的另一个原因(即使符合 UITableViewDataSource!)是在设置 tableView.tableHeaderView 之前设置 tableView.dataSource

// Header config
self.tableView.tableHeaderView = header; // CRASH!! Triggers table view update and thus calls unknown selector.
self.tableView.dataSource = self;

真正简单的解决方法是在设置 tableHeaderView(或 tableFooterView)之前先设置数据源:

self.tableView.dataSource = self;
// Header config
self.tableView.tableHeaderView = header; // Runtime can now find selector even though it is already defined.

答案 9 :(得分:0)

如果您正确设置了所有内容,但仍然出现此错误。您需要为自定义类enter image description here

分配一个控制器