2014-10-07 2 views
-1

настоящего времени у меня кнопка в viewForFooterInSection каждой секции, что при нажатии на увеличивает высоту строк 5-10 с высоты от 0 до высоты 65, как показано ниже:Как иметь разные высоты строк в каждом разделе UITableView?

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { 
    UIView *view = [[UIView alloc] initWithFrame:CGRectZero]; 
    view.backgroundColor = [UIColor whiteColor]; 

    self.moreButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    self.moreButton.frame = CGRectMake(0, 0, 320, 44); 
    [self.moreButton setImage:[UIImage imageNamed:@"downarrow.png"] forState:UIControlStateNormal]; 
    [self.moreButton addTarget:self action:@selector(moreButtonSelected:) forControlEvents:UIControlEventTouchUpInside]; 
    [view addSubview:self.moreButton]; 

    return view; 
} 

- (void)moreButtonSelected:(id)sender { 
    if (_hasPressedShowMoreButton == NO){ 
     self.hasPressedShowMoreButton = YES; 
    } 
    else if (_hasPressedShowMoreButton == YES){ 
     self.hasPressedShowMoreButton = NO; 
    } 

    [self.matchCenter reloadData]; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (_hasPressedShowMoreButton == YES){ 
     return 65; 
    } 

    else if (_hasPressedShowMoreButton == NO){ 
     if (indexPath.row > 3){ 
      return 0; 
     } 
     else{ 
      return 65; 
     } 
    } 

} 

Это означает, как «показать больше», чтобы при нажатии отображались остальные строки, а не только первые 4. Проблема заключается в том, что при нажатии кнопки в нижнем колонтитуле раздела она расширяет ВСЕ разделы до 10 строк, а не только ту, где была нажата кнопка. Как я могу указать только раздел, где была нажата кнопка?

EDIT:

Я попытался следующие предложения и делать это, как показано ниже, но это вызывает сбой с ошибкой 'NSInvalidArgumentException', reason: '-[UIButton section]: unrecognized selector sent to instance 0x7f94840640b0'.

Код:

- (void)moreButtonSelected:(NSIndexPath *)indexPath{ 
    if (_hasPressedShowMoreButton == NO){ 
     self.hasPressedShowMoreButton = YES; 
     indexPath.section == _expandedSection; 
    } 
    else if (_hasPressedShowMoreButton == YES){ 
     self.hasPressedShowMoreButton = NO; 
    } 

    [self.matchCenter reloadData]; 
} 


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (_hasPressedShowMoreButton == YES){ 
     if (indexPath.section == _expandedSection){ 
      return 65; 
     } 

    } 

    else if (_hasPressedShowMoreButton == NO){ 
     if (indexPath.row > 3){ 
      return 0; 
     } 
     else{ 
      return 65; 
     } 
    } 

} 
+0

Вы не можете использовать один ivar '_hasPressedShowMoreButton'. Вам нужно следить за состоянием кнопки для всех разделов. – rmaddy

+0

@rmaddy Ах, имеет смысл. Размышление о том, как я могу отслеживать состояние каждой соответствующей кнопки? – Ghobs

ответ

1

Вы также должны проверить indexPath.section == _expandedSection. (Сохраните indexPath.section вашей нажатой дополнительной кнопки в _expandedSection.)

Расширьте UIButton, чтобы разрешить разделение на него.

@interface MoreButton : UIButton 
@property (assign) NSInteger sectionIndex; 
@end 

@implementation MoreButton 
@end 

Добавить объект недвижимости к вашему классу.

@property (assign) NSInteger expandedSection; 
self.expandedSection = -1; 

При создании его (и не использовать self. для его создания), назначить sectionIndex.

MoreButton *moreButton = [MoreButton buttonWithType:UIButtonTypeCustom]; 
moreButton.sectionIndex = section; 
[moreButton addTarget:self action:@selector(moreButtonSelected:) forControlEvents:UIControlEventTouchUpInside]; 
[view addSubview:moreButton]; 

Тогда в обработчике:

- (void)moreButtonSelected:(MoreButton *)button { 
    self.expandedSection = button.sectionIndex; 
    [self.matchCenter reloadData]; 
} 

и ваша высота для ряда:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.section == self.expandedSection || indexPath.row <= 3) { 
    return 65; 
    } 
    return 0; 
} 

Вы можете использовать NSMutableSet для expandedSections вместо этого, если вы хотите, чтобы расширить мультипликатор в то время, , используя следующие линии:

@property (strong) NSMutableSet *expandedSections; 
self.expandedSections = [NSMutableSet set]; 

if ([self.expandedSections containsObject:@(section)]) { 
    [self.expandedSections removeObject:@(section)]; 
} else { 
    [self.expandedSections addObject:@(section)]; 
} 

if ([self.expandedSections containsObject:@(indexPath.section)] || indexPath.row <= 3) 
+0

Ах имеет смысл. Я немного смущен тем, что вы подразумеваете под «Хранить' indexPath.section' вашей нажатой дополнительной кнопки в '_expandedSection'. Ум покажет мне пример? Благодаря! – Ghobs

+0

Обновлен мой ответ для вас. –

+0

Это дает мне следующее сообщение об ошибке: 'неопределенные символы для архитектуры x86_64: "_OBJC_CLASS _ $ _ MOREBUTTON", ссылочные от: ObjC-класса реф в MatchCenterViewController.o LD: Символ (ы) не найдено для архитектуры x86_64 лязг: ошибка: команда компоновщика завершилась неудачно с кодом выхода 1 (используйте -v для вызова вызова) ' – Ghobs

1

Проблема я думаю, что indexPath.row не всегда используется - когда _hasPressedShowMoreButton верно, то возвращает 65 независимо:

if (_hasPressedShowMoreButton == YES){ 
    return 65; 
} else if (_hasPressedShowMoreButton == NO){ 
    if (indexPath.row > 3){ 
     return 0; 
    } 
    else{ 
     return 65; 
    } 
} 

Вы должны изменить его на что-то большее в следующей структуре, и судья indexPath.row с внешний самый большой, если:

if (indexPath.row > 3) { 
    //some logic here 
} else { 
    //some logic 
} 
+0

Проверьте мои изменения. – Ghobs

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