Содержимое TableView не отображается «TableView:numberOfRowsInSection:]: отправлен нераспознанный селектор экземпляру»

#iphone #xcode #uitableview #storyboard

#iPhone #xcode #uitableview #раскадровка

Вопрос:

Я видел похожие темы и читал их, но я все еще не могу заставить это работать. Поэтому я решил опубликовать свой код здесь на случай, если кто-нибудь сможет мне помочь в дальнейшем. Я пытаюсь создать tableview внутри ViewController. Я использую Xcode 4.5 и раскадровку.

prodViewController.h

     #import <UIKit/UIKit.h>

    @interface prodViewController : UIViewController <UITableViewDelegate , UITableViewDataSource>

@property (strong, nonatomic) IBOutlet UIView *prodview;

// properties of ui

@property (strong, nonatomic) IBOutlet UIImageView *image;

@property (strong, nonatomic) IBOutlet UILabel *namelbl;

@property (strong, nonatomic) IBOutlet UILabel *manufactlbl;

@property (strong, nonatomic) IBOutlet UILabel *scorelbl;

@property (strong, nonatomic) IBOutlet UILabel *dscrlbl;

@property (strong, nonatomic) IBOutlet UILabel *videolbl;

// properties of tab bar

@property (strong, nonatomic) IBOutlet UITabBarItem *addfav;

@property (strong, nonatomic) IBOutlet UITabBarItem *compare;
@property (strong, nonatomic) IBOutlet UITabBarItem *more;


// table

@property (strong, nonatomic) IBOutlet UITableView *tableview;

@end
  

prodViewController.m

         #import "prodViewController.h"

        @interface prodViewController ()

        @end

        @implementation prodViewController
  @synthesize tableview;
@synthesize prodview;


@synthesize addfav;
@synthesize compare;
@synthesize more;


@synthesize image;
@synthesize namelbl;
@synthesize manufactlbl;
@synthesize scorelbl;
@synthesize dscrlbl;
@synthesize videolbl;





- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    [tableview setDataSource:self];
    [tableview setDelegate:self];

}

- (void)viewDidUnload
{


    [self setAddfav:nil];
    [self setCompare:nil];
    [self setMore:nil];

    [self setProdview:nil];
    [self setTableview:nil];
      [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}



        @end
  

Подключения к просмотру таблицы:

введите описание изображения здесь

Ошибка:

 [prodViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x683a5b0
2*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[prodViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x683a5b0'
  

Новая ошибка:

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

 -[prodViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x6c34c80
  

Комментарии:

1. вызываете ли вы TableView: numberOfRowsInSection: явно с любого другого контроллера? Почему вы объявили методы источника данных табличного представления в своем заголовочном файле?

2. Нет, пока нет. Но даже если я удалю их, это ничего не изменит @NagaMalleshMaddali

Ответ №1:

Имена методов чувствительны к регистру. Первая часть должна быть tableView:... ( V заглавной буквой), но у вас все в нижнем регистре: tableview:... .

Комментарии:

1. Спасибо, я исправил это, и он работает правильно! Но если я удалю реализованные методы в коде, чтобы применялись только изменения раскадровки, я все равно получу ту же ошибку. Почему это?

Ответ №2:

Вам следует избавиться от объявлений метода в файле интерфейса.

Протокол — это все, что необходимо для определения UITableViewDatasource или UITableViewDelegate .

Вызываете ли вы эти методы вручную откуда-нибудь в своем проекте? Метод tableView:numberOfRowsInSection: должен вызываться только tableview. Вы не должны вызывать его самостоятельно.

Редактировать

Кроме того, вам не нужно устанавливать источник данных и делегировать в viewDidLoad вы уже делаете это в InterfaceBuilder.

Похоже, что здесь вы следуете очень старому руководству. Я бы рекомендовал ознакомиться с более актуальным руководством.

Сайт Рэя Вендерлиха — это всегда хорошее место для начала.

Комментарии:

1. Через interface builder понятия не имею, почему, но это не сработало должным образом.

2. @user3211165 пожалуйста, смотрите ответ Aleksej. Это правильно. Вы использовали a, v когда вам нужно V .

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

4. @user3211165 ПОСМОТРИТЕ на ДРУГОЙ ОТВЕТ. ДРУГОЙ ОТВЕТ ПРАВИЛЬНЫЙ. Это не имеет ничего общего с Interface Builder.

5. @user3211165 Я думаю, вы неправильно понимаете, как работает представление таблицы. Вы не можете предоставить содержимое для табличного представления в построителе интерфейса. Если только вы не используете статическое табличное представление.