Проблемы с соединением метод TableView для источника данных.XIB


Поэтому я пытаюсь подключить компонент tableView к UIViewController, созданному через .пользовательский интерфейс xib. Я получаю классическую -[UIView tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x1f544cb0 и предполагаю, что я подключил что-то неправильно или делаю что-то, что я не должен делать с построителем интерфейса. Я искал google и Stack overflow и нашел похожие вопросы, но не с ответами, которые помогли моей ситуации. Я бьюсь головой, пытаясь понять это, и надеюсь, что кто-то здесь сможет помощь. Я всегда делал это только через раскадровку или с помощью .xib, когда контроллер был UITableViewController. Обычно я просто использую UITableViewController, но мне может потребоваться добавить панель инструментов в нижней части представления, так что эта опция не жизнеспособна. Вот шаги, которые я предпринял, чтобы создать класс, пожалуйста, дайте мне знать, если я делаю что-то неправильно

Я сначала создаю файл с XIB для пользовательского интерфейса: Введите описание изображения здесь

Затем я добавляю компонент табличного представления в XIB: Введите описание изображения здесь

В LeftMenuViewController.h я добавляю следующую строку кода, чтобы сообщить разрешить классу использоваться в качестве UITableViewDelegate и UITableViewDataSource:

@interface LeftMenuViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

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

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

Затем я добавляю следующие строки кода к LeftMenuViewController.м для определения необходимого метода TableView делегат методы:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 48;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell;
    return cell;
}

Этот процесс приводит к тому, что приложение создает исключение NSInvalidArgumentException, которое приводит к ошибке [UIViewController tableView:numberOfRowsInSection:]: unrecognized selector. Что я делаю не так? Все, что я пробовал или что мне рекомендовали, не сработало.

3 4

3 ответа:

Тот факт, что ошибка ссылается на UIViewController в вашем сообщении об ошибке, [UIViewController tableView:numberOfRowsInSection:]: unrecognized selector, это означает, что владелец файла не был установлен (он должен ссылаться на ваш подкласс контроллера вида, а не на сам UIViewController). Вы правильно указали делегат и источник данных в своем наконечнике, поэтому мне интересно, как вы создали экземпляр контроллера вида.

Вы должны были создать его с помощью чего-то вроде:

SecondViewController *controller = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
[self presentViewController:controller animated:YES completion:nil];

Или, если имя наконечника не совпадает с именем контроллера:

SecondViewController *controller = [[SecondViewController alloc] initWithNibName:@"MyNibName" bundle:nil];
[self presentViewController:controller animated:YES completion:nil];

Нажмите на владельца файла в вашем файле NIB в разделе Местозаполнители и убедитесь, что пользовательский класс установлен в LeftMenuViewController или как вы его назвали.

In viewDidLoad:

self.tableView.delegate = self;