Подтвердить что ты не робот

Два UITableView в одном представлении

Я хочу знать, разрешено ли использовать Multiple UItableView в том же представлении (я не вижу ничего в Руководства по человеческому интерфейсу Apple), и если это нормально, как загружать разные DataSource в viewDidLoad для каждого UItableView?

4b9b3361

Ответ 1

У вас может быть несколько видов таблиц. Вы хотите, чтобы вы указали указатель на каждый из них, а затем в своих методах источника данных вы сделали бы что-то вроде этого:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
     if(tableView == tableViewOne)
           return 5;
     else //if (tableView == tableViewTwo)
           return 3;
}

Это будет одинаково для всех методов создания делегатов/источников данных, поэтому они дают вам представление таблицы в качестве параметра.

Ответ 2

Да, вы можете. Проблема в том, что каждый UITableView будет использовать те же UITableViewDataSource и UITableViewDelegate. Поэтому вы должны определить, с каким табличным представлением вы работаете в каждом из необходимых методов делегирования.

Например:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    // make bigger rows

    if (tableView == myBigRowTableView)
    {
        // make bigger rows
        return 127;
    } else if (tableView == mySmallRowTableView) {
        // make smaller rows
        return 20;
    } else {
        return 30;
    } 
}

Ответ 3

IMO самым чистым решением будет иметь один контроллер для каждого вида таблицы.

Если вы используете один контроллер для n tableview, вам придется использовать if-statemenst во многих местах, в

  • – numberOfSectionsInTableView:
  • – tableView:numberOfRowsInSection:
  • – tableView:titleForHeaderInSection:
  • ...

В основном во всех методах UITableViewDatasource-Protocol, которые вам необходимо реализовать.

Итак, если вам нужно что-то изменить, вы должны изменить его во многих местах.

Если вы используете один класс контроллера для одного вида таблицы, вам не нужно будет вообще проверять.

  • написать класс контроллера для каждого вида таблицы, сделать его соответствующим протоколу UITableViewDatasource
    • реализовать методы протокола, которые вам понадобятся. как минимум
      • – numberOfSectionsInTableView:,
      • – tableView:numberOfRowsInSection:,
      • – tableView:cellForRowAtIndexPath:
  • вызов -setDataSource: для каждого вида таблицы для объекта класса правого контроллера

Я написал пример кода: https://github.com/vikingosegundo/my-programming-examples/tree/master/TwoTableViews

TwoTableViewsViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    if (firstController == nil) {
        firstController = [[FirstTVContoller alloc] init];
    }
    if (secondController == nil) {
        secondController = [[SecondTVController alloc] init];
    }
    [firstTable setDataSource:firstController];
    [secondTable setDataSource:secondController];

    [firstTable setDelegate:firstController];
    [secondTable setDelegate:secondController];
    firstController.view = firstController.tableView;
    secondController.view = secondController.tableView;
}

Ответ 4

Вы можете установить тег для каждой таблицы. Затем примените это условие к методу делегата tableview, например:

myTable.tag=12;

Ответ 5

Чтобы облегчить жизнь, вы можете передать в UITableView два разных делегата. Если вы передадите один и тот же делегат, вам придется делать много утверждений if. Создав два разных делегата, он позволит вашему коду быть намного чище.

Ответ 6

В одном представлении можно просматривать несколько таблиц. Добавьте теги в каждое представление таблицы и с помощью tableview.tag вы можете отдельно загружать данные в таблицы.

Пример:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
     if (tableView.tag == x) {
        //code to load table view with tag value x

        }
        else{
        //code to load second table
        }
        return cell;

    }