Использование нескольких UITableView в XIB

Я создал пользовательский виджет в виде файла XIB, в котором у меня есть несколько UITableView и UIButton. В соответствующем файле swift, который является владельцем этого XIB, у меня есть выходы на эти TableViews.

Я добавил этот виджет в представление внутри представления в файле UIViewController. Теперь в соответствующем файле swift этого контроллера мне нужно назначить dataSource и delegate каждому из табличных представлений, а действие кнопке.

Я долго искал в Интернете, и кажется, что @IBInspectable vars - это путь, но, похоже, я не могу создать переменную типа UITableView, UITableViewDelegate или UITableViewDatasource как @IBInspectable.

Итак, как мне использовать табличные представления и кнопку? Может ли кто-нибудь направить меня к правильной документации, примеру или объяснить?


person rgamber    schedule 14.02.2015    source источник


Ответы (1)


Нет необходимости использовать @IBInspectable. Вы можете просто использовать каждый источник таблицы в методах UITableViewDelegate условно. Вот один из способов сделать это:

Сначала в UITableViewController вашей раскадровки добавьте ячейку-прототип, затем в эту ячейку-прототип добавьте UITableView с собственной ячейкой-прототипом.

Затем установите идентификаторы повторного использования внутренней и внешней ячейки табличного представления следующим образом:

Ячейка представления внешней таблицы: Идентификатор повторного использования ячейки представления внешней таблицы

Ячейка внутреннего табличного представления: Идентификатор повторного использования внутренней ячейки табличного представления

Затем свяжите источник данных этого внутреннего табличного представления и делегируйте его собственному источнику данных UITableViewController и делегируйте:

Связать источник данных и делегат №1Связать источник данных и делегат №2

Затем в вашем классе UITableViewController вы можете условно установить элементы своих таблиц, например:

- (void)viewDidLoad {
    [super viewDidLoad];
    dataSource1 = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", nil];
    dataSource2 = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == self.tableView) {
        return 80;
    } else {
        return 20;
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    if (tableView == self.tableView) {
        return dataSource1.count;
    } else {
        return dataSource2.count;
    }
}

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

    UITableViewCell *cell;

    if (tableView == self.tableView) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier" forIndexPath:indexPath];
    } else {
        cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier2" forIndexPath:indexPath];
    }

    // Configure the cell...
    if (tableView == self.tableView) {
        cell.textLabel.text = [dataSource1 objectAtIndex:indexPath.row];
    } else {
        cell.textLabel.text = [dataSource2 objectAtIndex:indexPath.row];
        cell.backgroundColor = [UIColor blueColor];
    }
    cell.textLabel.backgroundColor = [UIColor clearColor];

    return cell;
}

Что в данном случае дает следующий результат: Окончательный результат

person Lyndsey Scott    schedule 14.02.2015
comment
Так что мне придется сделать это в подклассе UITableViewController. Как мне подключить table1 и table2 из xib к этому? - person rgamber; 14.02.2015
comment
@rgamber Нет, не нужно делать это в подклассе UITableViewController. Я обновлю свой ответ, чтобы уточнить. - person Lyndsey Scott; 14.02.2015
comment
Я ценю подробный ответ :). Я думаю, что есть некоторое недоразумение. Я делаю это не из раскадровки, а из xib. Я создал «виджет», который содержит несколько TableView и который я буду повторно использовать в разных представлениях. Поэтому мне нужен способ подключения таблиц в виджете к контроллерам таблиц на основе того, из какого представления он вызывается. Эти контроллеры будут разными в разных представлениях. Извините, если мой вопрос был недостаточно ясен! - person rgamber; 14.02.2015
comment
Мой ответ будет работать либо из раскадровки, либо из xibs, так что это совсем не имеет значения ... Но тот факт, что вы повторно используете виджет табличного представления в нескольких представлениях, имеет ОЧЕНЬ большое значение. Чтобы сделать что-то вроде того, что я предложил, вам нужно установить источник данных внутренних таблиц и делегировать его каждому текущему представлению. Я не могу ответить более конкретно, не зная намного больше о структуре вашего приложения... - person Lyndsey Scott; 14.02.2015
comment
Я понимаю! Я читаю больше об этом, хотя, вероятно, напишу вам, если застряну на очень долгое время, с более подробной информацией! Написание приведенного выше ответа, должно быть, потребовало некоторых усилий, так что большое спасибо. Это помогает лучшему моему пониманию! - person rgamber; 14.02.2015