web-dev-qa-db-fra.com

tableView: numberOfRowsInSection:]: sélecteur non reconnu envoyé à l'instance

J'ai un problème étrange. Je reçois cette erreur:

 -[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) 

Ok, je me suis assuré que ViewController est défini comme source de données et délégué. J'ai ajouté UITableViewDelegate et UITableViewDataSource aux <> objets. 

J'ai défini tableView.delegate = self et tableView.dataSource = self dans ma méthode viewDidLoad. 

Voici mon implémentation des méthodes viewDidLoad et 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];

}

Voici le corps de ma méthode pour numberOfRowsInSection:

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

Voici mon fichier d'en-tête pour le contrôleur de vue:

#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

Voici une capture d'écran montrant comment ma tableView est connectée:

enter image description here

20
jimbob

Lisez ce que le message d'erreur vous dit!

Vous avez implémenté numberOfRowsInSection:. Et alors? C'est la mauvaise méthode. Ce n'est pas pertinent. Il ne sera jamais appelé.

La méthode que vous devez implémenter s'appelle tableView:numberOfRowsInSection:. C'est complètement différent.

31
matt

I had delegate and datasource hooked up to the TableView

Si vous cliquez sur la vue, les connexions ci-dessus doivent apparaître dans INSPECTOR . Si vous n'avez pas connecté ViewController, vous obtiendrez le message d'erreur suivant:

'NSInvalidArgumentException', raison: '- [UIView tableView: numberOfRowsInSection:]: sélecteur non reconnu envoyé à exemple

Comment j'ai arrêté l'erreur c'est toi 

  1. appuyez sur le ViewController pour le sélectionner
  2. recherchez Prise de référence dans les prises dans l'inspecteur de connexion à droite
  3. faites glisser depuis le cercle de la New Referencing Outlet vers la vue
  4. lorsque vous relâchez la souris, une toute petite fenêtre apparaîtra - sélectionnez source de données
  5. répétez l'étape 3 et cette fois sélectionnez delegate

Une fois terminé, il devrait ressembler à l'image ci-dessous!

Referencing outlet Datasource and delegate connected to view

Cela a arrêté l'erreur ci-dessus pour moi . J'espère que cela aidera quelqu'un.

27
uplearnedu.com

Vous verrez également cette erreur si, bien que vous ayez tout connecté correctement dans le contrôleur de vue, vous avez oublié d'attribuer votre classe de contrôleur de vue personnalisée à votre storyboard:

 Enter your custom view controller in identity inspector

11
DonVaughn

Vous verrez également cette erreur si, bien que vous ayez tout connecté correctement dans le contrôleur de vue, vous avez oublié d'étendre UITableViewDelegate, UITableViewDataSource.

4
user10375102

Vérifiez si vous avez défini UITableViewDelegate, UITableViewDataSource dans votre fichier de classe:

class ClassName: UIViewController, UITableViewDelegate, UITableViewDataSource  
{

}
4
ninahadi
- (NSInteger)numberOfRowsInSection:(NSInteger)section;

Vous n'implémentez pas la méthode UITableViewDataSource. Supprimez la déclaration et elle ne plantera plus. Ou encore, fournissez un corps de méthode pour cela.

2
brynbodayle

Si vous avez tout configuré correctement et que vous obtenez toujours cette erreur. Vous devrez assigner un contrôleur à votre classe personnalisée  enter image description here

0
Soufiane