2 таблицы в одном представлении - PullRequest
4 голосов
/ 16 августа 2010

Мне нужен пример или объяснения того, как заполнить два табличных представления, которые находятся в одном представлении.Мне нужно понять метод "cellForRowAtIndexPath". Может ли кто-нибудь предоставить мне пример того, каким должен быть код?

Я имею в виду, как определить, какой из этих таблиц обрабатывается?

Спасибо

Ниже приведен мой метод cellForRowAtIndexPath:

 // Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

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

// Configure the cell...
// Set up the cell
MyAppAppDelegate *appDelegate = (MyAppAppDelegate *)[[UIApplication sharedApplication] delegate];
    if (tableView == radios_tv) { //radio_tv is an IBOutleet UITableView
        sqlClass *aRadio = (sqlClass *)[appDelegate.array_radios objectAtIndex:indexPath.row];
        [cell setText:aRadio.r_name];
        return cell;
    }
    if (tableView == presets_tv) { //preset_tv is an IBOutlet UITableView


    }

}

и эй, vikingsegundo, теперь мне нужно удалить ячейку, которая находится в моем классе TableViewController, как мне это сделать?Я объясняю, вот мой код:

- (void)tableView:(UITableView *)tv commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
forRowAtIndexPath:(NSIndexPath *)indexPath {

    if(editingStyle == UITableViewCellEditingStyleDelete) {

        //Get the object to delete from the array.
        Coffee *coffeeObj = [appDelegate.coffeeArray objectAtIndex:indexPath.row];
        [appDelegate removeCoffee:coffeeObj];

        //Delete the object from the table.
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

Так как мы устанавливаем разные контроллеры, как мы должны действовать для этой строки?Должен ли я поставить tableViewController вместо "self"?

//Delete the object from the table.
            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

Ответы [ 2 ]

9 голосов
/ 16 августа 2010

ИМО самым чистым решением было бы иметь один контроллер для каждого просмотра таблицы.

radios_tv будет вызывать собственный метод делегата, а presets_tv - собственный.

редактировать

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

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

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

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

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

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

Я думаю, это было показано в одном из видео WWDC 2010 . Я не уверен, но я предполагаю, что это была Сессия 116 - Модель-представление-контроллер для iPhone OS .

редактировать

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

0 голосов
/ 16 ноября 2012

На одном контроллере представления, если вам нужно использовать две таблицы, вы можете установить IBOutlet для обеих таблиц или назначить им разные теги, чтобы при использовании следующей cellForRowAtIndexPath вы могли различать в обеих таблицах, как показано ниже

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

    UITableViewCellStyle style =UITableViewCellStyleSubtitle;
    static NSString *MyIdentifier = @"MyIdentifier"; 
    DataListCell  *cell = (DataListCell*)[tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

    cell = [[DataListCell alloc]  initWithStyle:style reuseIdentifier:MyIdentifier];

    cell.selectionStyle=UITableViewCellSelectionStyleNone;



        if(tableView==tblLanguage)//tblLanguage IBOutlet for first table
        {  
            if ((selectedIndexPath != nil) && (selectedIndexPath.row == indexPath.row))
            {

                UIImageView *imgView=[[UIImageView alloc]initWithFrame:CGRectMake(320-30, 9, 22, 15)];
                imgView.image=[UIImage imageNamed:@"btn_Expand.png"];
                [cell addSubview:imgView];



                tblSongs.hidden=NO;
                tblSongs.frame=CGRectMake(0,42, 320, ([arrSongListForSpecificLanguage count]*40));
                [cell addSubview:tblSongs];
            }
            else 
            {
                UIImageView *imgView=[[UIImageView alloc]initWithFrame:CGRectMake(320-30, 9, 16, 22)];
                imgView.image=[UIImage imageNamed:@"btn_Collaps.png"];
                [cell addSubview:imgView];
            }


            cell.lblCustomerName.textColor=[UIColor blackColor];
            cell.lblCustomerName.font=[UIFont boldSystemFontOfSize:16];




            //set the first label which is always a NamesArray object
            [cell setcustomerName:[objAppDelegate.viewController.arrLanguage objectAtIndex:indexPath.row]];
        }
        else //for other table
        {
            ParseData *objParse;
            objParse=[arrSongListForSpecificLanguage objectAtIndex:indexPath.row];



            cell.lblCustomerName.textColor=[UIColor blackColor];
            cell.lblCustomerName.frame=CGRectMake(cell.lblCustomerName.frame.origin.x, cell.lblCustomerName.frame.origin.y, 310, cell.lblCustomerName.frame.size.height);


            //set the first label which is always a NamesArray object
            [cell setcustomerName:objParse.track];

        }
        return cell;    
    }


}

Вы также можете использовать тег для того же оператора if, как показано ниже: if (tableView.tag == 1) // тег tblLanguage = 1

Аналогично, если оператор используется для других методов таблицы делегата и источника данных таблицы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...