IOS: методы делегата tableview для двух tableview

У меня есть этот метод делегата для tableview внутри класса:

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return [array1 count];
}

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


static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil){
    cell = [[[UITableViewCell alloc]initWithStyle:UITableViewStylePlain reuseIdentifier:CellIdentifier] autorelease] ; 
}

cell.textLabel.text = [array1 objectAtIndex:indexPath.row];

return cell;
}

если у меня есть один UITableView, это нормально, но если у меня есть два UITableView? Как я могу организовать свой код? с тэгом?

4 ответов


посмотрите, как все методы делегата имеют tableView:(UITableView *)tableView в них?

вы можете определить свои представления таблицы в файле заголовка, а затем просто пойти: (предполагая, что ваша таблица называется myTable)

if (tableView == myTable)

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

например:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return [array1 count];
}

будет:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (tableView == myTable)
    {
       return [array1 count];
    }
    if (tableView == myTable2)
    {
       return [array2 count];
    }

    return 0;
}

мое предложение с вашей акт исходные данные в виде таблицы делегат, а не контроллер.

Это дизайн более близкий к шаблону Model-View-Controller и позволит вам гораздо больше гибкости и избежать проверки конкретного значения, которое tableView аргумент попал в ваши методы делегата.

в вашем случае ваш делегат / источник данных будет классом с членом типа NSArray и осуществляет UITableViewDelegate протокол.


Да, вы можете сделать это с помощью тега. Дайте UITableViews теги 1 и 2.

настройки коммутатора:

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

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil){
    cell = [[[UITableViewCell alloc]initWithStyle:UITableViewStylePlain reuseIdentifier:CellIdentifier] autorelease] ; 
}

switch ([tableView tag]) {
  case 1:{
    [[cell textLabel] setText:@"First tag"]
    break;
  }
  case 2:{
    [[cell textLabel] setText:@"Second tag"]
    break;
  }
  default:
    break;
}

return cell;
}

каждый из этих методов передает ссылку на представление таблицы, которое его вызывает. Обычно я подключаю каждую таблицу к розетке в interface builder и условно возвращаю источник данных на основе сравнения с tableView в методах делегата и именах розеток. Это также возможно с помощью тега, но более беспорядочно и более открыто для осложнений при редактировании структуры представления.