33

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

 -[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 是如何连接的:

在此处输入图像描述

4

10 回答 10

33

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

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

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

于 2012-09-14T20:15:41.243 回答
29

我将委托和数据源连接到 TableView

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

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

我如何停止错误是你

  1. 按下 ViewController 以选择它
  2. 在右侧的连接检查器中查找引用插座
  3. 从新参考出口的圆圈拖动到视图
  4. 当您释放鼠标时,将显示一个小弹出窗口 - 选择数据源
  5. 重复第 3 步,这次选择委托

完成后,它应该如下图所示!

引用出口数据源和委托连接到视图

这为我停止了上述错误。我希望这可以帮助别人。

于 2013-11-18T01:18:51.327 回答
20

检查您的类文件中是否定义了 UITableViewDelegate、UITableViewDataSource:

class ClassName: UIViewController, UITableViewDelegate, UITableViewDataSource  
{

}
于 2018-10-17T08:39:21.340 回答
11

如果您已经在视图控制器中正确连接了所有内容,但您忘记在情节提要中分配自定义视图控制器类,您也会看到此错误:

在身份检查器中输入您的自定义视图控制器

于 2016-06-12T20:07:45.600 回答
6

我认为展示这个答案很重要。这似乎很愚蠢,可能是这样,但我失去了很长一段时间,直到我看到错误。

它发生在我创建一个新视图并复制部分代码的情况下。

我创建了新视图:

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 {

也许错误可能是,不要声明UITableViewDelegateUITableViewDataSource协议

记住它,不要忘记它!

于 2019-04-28T14:17:36.040 回答
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

于 2013-07-29T21:18:32.910 回答
4

如果您已经在视图控制器中正确连接了所有内容,但您忘记扩展 UITableViewDelegate、UITableViewDataSource,您也会看到此错误。

于 2018-09-17T12:42:11.220 回答
2
- (NSInteger)numberOfRowsInSection:(NSInteger)section;

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

于 2012-09-14T19:50:23.020 回答
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.
于 2021-01-07T20:37:33.350 回答
0

如果您已正确设置所有内容,但您仍然会收到此错误。您需要为您的自定义类分配一个控制器在此处输入图像描述

于 2018-08-01T15:24:57.053 回答