TableView: numberOfRowsInSection:]: непризнанный селектор, отправленный в экземпляр

У меня странная проблема. Я получаю эту ошибку:

 -[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 в < > штук.

Я установил tableView.delegate = self и tableView.dataSource = self в свой метод viewDidLoad.

Вот моя реализация методов 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];

}

Вот мой метод body для 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

Ответы

Ответ 1

Ознакомьтесь с сообщением об ошибке!

Вы внедрили numberOfRowsInSection:. И что? Это неправильный метод. Это не имеет значения. Это никогда не будет называться.

Метод, который нужно реализовать, называется tableView:numberOfRowsInSection:. Это совершенно другое.

Ответ 2

I had delegate and datasource hooked up to the TableView

Если вы нажмете на представление, оно должно показать указанные выше соединения в INSPECTOR. Если вы еще не подключили ViewController, вы получите сообщение об ошибке:

'NSInvalidArgumentException', причина: '- [UIView tableView: numberOfRowsInSection:]: непризнанный селектор, отправленный в экземпляр

Как я остановил ошибку, вы

  • нажмите на ViewController, чтобы выбрать его
  • найдите Referuting Outlets в инспекторе подключения справа
  • перетащить из круга новой точки реферирования в представление
  • когда вы отпустите мышь, появится небольшое всплывающее окно - выберите источник данных
  • повторите шаг 3 и на этот раз выберите делегат

Когда все будет сделано, оно должно выглядеть как изображение ниже!

Referencing outlet Datasource and delegate connected to view

Это остановило ошибку выше для меня. Надеюсь, это поможет кому-то.

Ответ 3

Вы также увидите эту ошибку, если, хотя вы правильно подключили все в контроллере представления, вы забыли назначить свой настраиваемый класс контроллера просмотра в своем раскадровке:

Введите свой собственный контроллер просмотра в инспекторе идентификации

Ответ 4

Проверьте, есть ли у вас UITableViewDelegate, UITableViewDataSource, определенный в вашем файле класса:

class ClassName: UIViewController, UITableViewDelegate, UITableViewDataSource  
{

}

Ответ 5

Это очень просто, у меня была аналогичная проблема. Я реализую свой TableView без Storyboard в моем ViewController, который имеет подклассу UIViewController с двумя протоколами: <UITableViewDataSource, UITableViewDelegate>

Но если вы посмотрите на UITableViewDataSource, есть два метода: @required и их нужно реализовать в коде:

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

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

Все остальные методы в UITableViewDelegate равны @optional, поэтому вам не нужно их реализовывать.

Ответ 6

Вы также увидите эту ошибку, если, хотя вы правильно подключили все в контроллере представления, вы забыли расширить UITableViewDelegate, UITableViewDataSource.

Ответ 7

- (NSInteger)numberOfRowsInSection:(NSInteger)section;

Вы не используете метод UITableViewDataSource. Удалите декларацию, и она больше не будет разбиваться. Или, альтернативно, предоставить ему тело метода.

Ответ 8

Если вы все настроили правильно и все равно получаете эту ошибку. Вам нужно будет назначить контроллер для вашего пользовательского класса enter image description here

Ответ 9

Вы, вероятно, пропустили реализацию протокола UITableView. Убедитесь, что вы реализовали протоколы, необходимые для реализации.

  1. UITableViewDelegate
  2. UITableViewDataSource

добавить реализации протоколов в файл h:

@interface YourClass : UIViewController <UITableViewDelegate,UITableViewDataSource>

@end

Добавьте необходимые методы в файл m:

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

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

Ответ 10

Я считаю важным показать этот ответ. Это кажется глупым, возможно, это так, но я потерял некоторое время, пока не увидел ошибку.

Это случилось со мной, создав новый вид и скопировав часть кода.

Я создал новый вид:

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

Имейте это в виду, не забывайте это!