iPhone: как управлять двумя таблицами в одном NIB - PullRequest
2 голосов
/ 11 декабря 2011

Мне нужны два UITableView в одном NIB.Я использовал IB и создал представление с двумя таблицами.

Мой заголовочный файл содержит ViewController и два класса, по одному для каждой из таблиц (см. Ниже).В IB я могу подключить делегат и источник данных каждой таблицы к FileOwner, но не могу понять, как создать соединение IBOutlet.Я получаю это сообщение: - [News tableView: numberOfRowsInSection:]: нераспознанный селектор отправлен в экземпляр 0x15d3c0 2011-12-11 07: 20: 27.480 myCity1 [659: 707] Завершение работы приложения из-за необработанного исключения'NSInvalidArgumentException', причина: '- [News tableView: numberOfRowsInSection:]: нераспознанный селектор отправлен на экземпляр 0x15d3c0'

Вот файл заголовка:

@interface News : UIViewController {

}

@end

@interface TownNews : UITableViewController {

UITableView *townNewsTable;

}

@property (nonatomic, retain) IBOutlet UITableView *townNewsTable;

@end

@interface GeneralNews : UITableViewController {

UITableView *generalNewsTable;

}

@property (nonatomic, retain) IBOutlet UITableView *generalNewsTable;

@end

Ответы [ 2 ]

6 голосов
/ 11 декабря 2011

Я имел дело с этой вещью в одном из моих проектов (вы можете посмотреть его: бесплатное приложение с именем IJCAI11 в магазине приложений; вкладка «Люди» (там индексация выполняется с помощью отдельного tableView));и, насколько я вижу из приведенного выше кода, вы делаете вещи слишком сложными.Я опишу, как я это сделал, вместо того, чтобы сказать, что вы не должны делать:)

У меня был только один класс, скажем, YaddaYaddaViewController.

@interface YaddaYaddaViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
{
    UITableView *tableView1;
    UITableView *tableView2;
}
@property (nonatomic, retain) IBOutlet UITableView * tableView1;
@property (nonatomic, retain) IBOutlet UITableView * tableView2;

@end

Обратите внимание, что viewController является производным от UIViewController, а не от UITableViewController (цель класса UITableViewController состоит в том, чтобы иметь возможность реализовать простой tableView за 2 минуты, для более нестандартных вещей вы всегда должны использовать UIViewController. Чтобы прочитатьподробнее об этом, взгляните на документацию класса UITableViewController).

В IB для «Владельца файла» я просто устанавливаю YaddaYaddaViewController;Я связываю выходы tableView1 и tableView2 с соответствующими таблицами в представлении;Я связываю делегат и источник данных с обоими tableView1 / 2, поэтому у меня есть «множественный» делегат и источник данных.

И, наконец, в коде для всех методов делегатов (например, tableView: cellForRowAtIndexPath :) Я просто обращаю внимание на значение tableView, делегат-событие которого вызвало вызов этого метода, например:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableView == self.tableView1) {
        // some code here
    } else {
        // alternative code here
    }
}

Надеюсь, это поможет!

0 голосов
/ 11 декабря 2011

@ makaron Что бы он ни говорил, это абсолютно правильно, за исключением

1), если вы объявили UItableView и хотите создать табличное представление с библиотекой (не программно), затем измените файл заголовка на: -

@interface MyTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
{
    IBOutlet UITableView *tableView1;
    IBOutlet UITableView *tableView2;
}

@end

и во всех делегатах табличного представления, таких как

NumberOfRowsInSection, NumberOfSection, CellForRowAtIndexPath, DidSelectRowAtIndexPath Проверьте условия

if (tableView == self.tableView1) {
        // code for tableView1
    } else {
        // code for tableView2
    }

Также, если вы не хотите объявлять два табличных представления в заголовкеfile.Drop Вниз двух табличных представлений из библиотеки в View и установите тег для каждого из них и сравните с помощью тега во всех делегатах табличного представления, таких как

NumberOfRowsInSection, NumberOfSection, CellForRowAtIndexPath, DidSelectRowAtIndexPath Проверьте условия

//I am assuming that tableView1 has tag set to be 1

    if (tableView.tag==1) {
            // code for tableView1
        } else {
            // code for tableView2
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...