2013-07-25 10 views
0

Я пытаюсь создать UITableView, как в these images. Один вид таблицы может содержать несколько разделов и его заголовки. Tableview может иметь количество разделов и количество строк. Но в каждом разделе можно выбрать только одну строку. И позже я смогу отобразить в своем UIAlertView выбранную строку как сообщение и раздел как заголовок. Как я могу достичь этого?Создание настраиваемого UITableView

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"GroupCell"]; 

    if (cell == nil) 
    { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"GroupCell"]; 
    } 

    if (indexPath.row == self.selectedCell) 
    { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     cell.selected = YES; 
    } 
    else 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell.selected = NO; 
    } 

    cell.textLabel.text = @"mytext" 
    cell.textLabel.textColor = [UIColor blackColor]; 

    return cell; 
} 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    self.selectedCell = indexPath.row; 

    [tableView reloadData]; // here i have to make the condition.. 
} 

Любая идея по этому вопросу? Или по-крайней мере, для отображения UITableView, как показано ниже изображение тоже достаточно ..

enter image description here

+0

взглянуть на эту ссылку https://github.com/gcamp/GCRetractableSectionController – Warewolf

+0

@ HERCULES Я уже пытался, что один. Не использовать. Даже он не отображает его таблицу в моем ViewController. – Praveenkumar

+0

u хотите выбрать только одну строку из каждой секции ИЛИ только одну строку из целого tableView? – Warewolf

ответ

2

Для ряда должны быть выбраны из каждого раздела вы должны сохранить массив selectedCell И времени отменяется все ячейки, которые вы должны управлять еще один массив, is isFirsttimeSelection И сохранить boolArray для rowCollapse.

интерфейс или файл заголовок реализация ..

NSArray *sectionArray; 
NSMutableDictionary *dictionary; 

NSMutableArray *boolArray; 
NSMutableArray *selectedCell; 
NSMutableArray *isFirsttimeSelection; 

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

dictionary=[[NSMutableDictionary alloc] initWithObjectsAndKeys:[NSArray arrayWithObjects:@"Cat",@"Dog",@"Lion",@"Tiger",@"Elephant",nil],@"Animals",[NSArray arrayWithObjects:@"Swallow",@"Parrot",@"Eagle",@"Owl",nil],@"Birds",[NSArray arrayWithObjects:@"Banana",@"Mango",@"Grapes", nil],@"Fruits",nil]; 

sectionArray=[[NSArray alloc] initWithArray:[dictionary allKeys]]; 

boolArray=[[NSMutableArray alloc] init]; 
selectedCell=[[NSMutableArray alloc] init]; 
isFirsttimeSelection=[[NSMutableArray alloc] init]; 

for (int i=0;i<sectionArray.count;i++) { 
    [boolArray addObject:[NSNumber numberWithBool:NO]]; 
    [isFirsttimeSelection addObject:[NSNumber numberWithInt:NO]]; 
    [selectedCell addObject:[NSNumber numberWithInt:0]]; 
} 

Tableview источники данных и делегатов, которые будут использоваться в качестве: ---

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return [sectionArray count]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if ([boolArray[section] boolValue]) { 
     return [[dictionary valueForKey:[sectionArray objectAtIndex:section]] count]; 
    } 
    return 0; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *[email protected]"cellIdentifier"; 
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (cell==nil) { 
     cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
    } 

    cell.accessoryType=((indexPath.row == [selectedCell[indexPath.section] intValue]) && ([isFirsttimeSelection[indexPath.section] intValue]==1))?UITableViewCellAccessoryCheckmark:UITableViewCellAccessoryNone; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.textLabel.text=[[dictionary valueForKey:[sectionArray objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]; 
    return cell; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{ 
    return 44; 
} 

вид заголовка для секции

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    UIButton *headerView=[UIButton buttonWithType:UIButtonTypeCustom]; 
    [headerView setTitle:[sectionArray objectAtIndex:section] forState:UIControlStateNormal]; 
    headerView.tag=section; 
    headerView.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; 
    [headerView setTitleEdgeInsets:UIEdgeInsetsMake(0, 10, 0, 0)]; 
    [headerView.titleLabel setFont:[UIFont boldSystemFontOfSize:16.0f]]; 
    [headerView setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal]; 
    [headerView setTitleShadowColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
    [headerView.titleLabel setShadowOffset:CGSizeMake(0, -1)]; 

    [headerView addTarget:self action:@selector(sectionTouched:) forControlEvents:UIControlEventTouchUpInside]; 

    return headerView; 
} 

Действие на просмотр заголовка щелкнул

- (void)sectionTouched:(UIButton *)sender 
{ 
    [boolArray replaceObjectAtIndex:sender.tag withObject:[NSNumber numberWithBool:([boolArray[sender.tag] boolValue])?NO:YES]]; 

    [_tblView reloadSections:[NSIndexSet indexSetWithIndex:sender.tag] withRowAnimation:([boolArray[sender.tag] boolValue])?UITableViewRowAnimationTop:UITableViewRowAnimationBottom]; 
} 

И наконец, сделал ЭСТ

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    selectedCell[indexPath.section] = [NSString stringWithFormat:@"%i",indexPath.row]; 
    isFirsttimeSelection[indexPath.section]=[NSNumber numberWithBool:YES]; 
    [tableView reloadData]; 
} 

Download it.

+0

Отлично! Работаю отлично! Я изменил это с помощью моего нового требования :) – Praveenkumar

1

Держите массив NSIndexpaths для обработки, какая строка выбрана, когда пользователь выбирает проверить индекс раздел уже в массиве и удалите, если они существуют, и выбор можно управлять в cellForRowAtIndexpath, проверяя массив, содержащий индекс, который делает ячейку выбранной или нет с accessoryType, и перезагружайте таблицу, когда новая строка выбрана и правильно ее управляет

+0

Где я должен хранить свои «NSIndexpaths» с помощью [this] (http://ge.tt/9oo6Inm/v/0?c) – Praveenkumar

+0

Как вы узнаете, какие все строки выбраны? –

+0

Вот что моя проблема. Не знаю, как управлять им – Praveenkumar

0

Вы должны реализовать вложенную таблицу ИЛИ, если это список (цена ...) - это исправить, тогда просто используйте логику :), как три кнопки при нажатии на перкулярное n затем установите рамку таблицы, а затем оставшуюся кнопку. :)

+0

Нет, значения будут динамическими. – Praveenkumar

+0

, если вы хотите отображать как новые обновленные изображения, тогда возьмите таблицу групп, это слишком просто :) – mindfreak

2

Где, как я знаю, ваш номер раздела зафиксирован. Поэтому, когда вы выбираете строку, проверяйте количество строк в этом разделе и используйте UITableViewCellAccessoryType для nil для этих строк и галочку accessoryType для строки selcted. И в конце дня вы должны проверить, какие строки выбраны в каждом разделе, и использовать данные этого раздела.

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

+0

Любой фрагмент фрагмента, связанный с этим? – Praveenkumar

+0

Нет образца фрагмента, только я дал вам логику для выполнения, потому что это достаточно для вас, поскольку вы хороший программист показывает свою репутацию;) – iEinstein

+0

На самом деле я был разработчиком Android. Я не очень хороший в iOS. Недавно перешел на эту платформу. И, учившись, когда я переместился :) [Здесь] (http://ge.tt/9oo6Inm/v/0?c), что я сделал? Подумайте с этим. – Praveenkumar

1

Попробуйте что-нибудь подобное.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     UITableViewCell * selectedCell = [self.tableView cellForRowAtIndexPath:indexPath]; 
     if (indexPath.section == 1) 
     { 
      selectedCell.accessoryType = UITableViewCellAccessoryCheckmark; 
      NSNumber * selectAnswer = [self.arrayWithObjects objectAtIndex:indexPath.row]; 
      if (![self.selectedAnswers containsObject:selectAnswer]) 
      { 
       [self.arrSelObj addObject:selectAnswer]; 
      } 
     } 
    } 

Где self.ArrayWithObjects - ваш массив с элементами, которые используются в методе numberOfRows. self.arrSelObj - массив, содержащий ваши ответы.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ([self.arrSelObj containsObject:[self.arrayWithObjects objectAtIndex:indexPath.row]]) 
      { 
       cell.accessoryType = UITableViewCellAccessoryCheckmark; 
      } 
} 

В didDeselect:

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell * deselectedCell = [tableView cellForRowAtIndexPath:indexPath];  
    if (indexPath.section == 1) 
    { 

     deselectedCell.accessoryType = UITableViewCellAccessoryNone; 

     NSNumber * deselectAnswer = [self.arrayWithObjects objectAtIndex:indexPath.row]; 
     [self.arrSelObj removeObject:deselectAnswer]; 
    } 
} 
+0

[Здесь] (http://ge.tt/9oo6Inm/v/0?c) - это мой код. Как я могу с этим справиться? – Praveenkumar

+0

Создать @property (неатомный, сильный) NSMutableArray * arrSelObj; В Init self.arrSelObj = [NSMutableArray array] ;. Затем используйте мой код. В NumberOfRows вы используете array.count. и это будет ваш self.ArrayWithObjects. В массиве вы можете поместить все данные из модели. – user2545330

+0

Попробуй и узнай! – Praveenkumar

Смежные вопросы