2013-06-05 7 views
2

В моем заголовке UITableView есть кнопка. Как только кнопка нажата внутри, как мы можем узнать, к какому разделу принадлежит кнопка? Поскольку представление таблицы доступно для редактирования, установите тег кнопки не так хорошо, когда некоторые строки будут удалены. Я попытался использовать indexPathForRowAtPoint:, чтобы получить индексную строку первой строки в разделе, но произошло что-то странное. Есть ли лучший подход?Как определить номер раздела вида заголовка раздела

Edit 1:

После того, как тег используется для идентификации раздела числа заголовка, тег не будет обновляться, когда некоторые строки были удалены. Из coz вы можете перезагрузить tableview, чтобы обновить тег, но, похоже, это не так хорошо.

Для странного поведения indexPathForRowAtPoint:, у меня есть вывесить другой вопрос: Weird behavior of UITableView method "indexPathForRowAtPoint:"

+1

Headerview не относится к разделу. Вы имеете в виду заголовок раздела? – Tim

+0

Извините, я имею в виду заголовок раздела. –

+1

Не знаете, почему этот вопрос поднят, поскольку он неполный. Что относительно редактируемой таблицы делает тег не работать? Что «странно случилось» с помощью indexPathForRowAtPoint? Где код для этого? Где какой-нибудь код для создания заголовка и кнопки? – danh

ответ

3

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

-(int)sectionNumberForView:(UIView*)view inTableView:(UITableView*)tableView { 

    int numberOfSections = [tableView numberOfSections]; 

    int i=0; 
    for(; i < numberOfSections; ++i) { 
     UIView *headerView = [tableView headerViewForSection:i]; 
     if (headerView == view) { 
      break; 
     } 
    } 

    return i; 
} 

Тогда внутри метода Target-действия и предполагая, что SuperView вашей кнопки является раздел вид заголовка:

-(void)buttonPressed:(UIButton*)sender { 

    int section = [self sectionNumberForView:sender.superview inTableView:_yourTableView]; 
} 

Надеется, что это помогает!

1

При создании каждого headerView и добавления UIButton, вы можете установить это тег к значению секции, и проверьте, что тег в метод действия для кнопок. Что-то вроде ...

В вашем создания:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; 

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
      button.frame = CGRectMake(10, 10, 20, 20); 
      [button setTag:section]; 
      [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 

    [view addSubview:button]; 

    return view; 
} 

Тогда в вашем методе действия:

- (void)buttonPressed:(UIButton *)sender 
{ 
    int section = sender.tag; 

    // Do something based on the section 
} 
+0

Но этот код страдает от проблема, поставленная в вопросе. Таблица доступна для редактирования. Номер раздела, с которым связан заголовок, может меняться со временем по мере добавления или удаления других разделов. Использование разделов или строк indexPath в качестве значения тега работает только с таблицами с фиксированными разделами и строками. – rmaddy

+0

Я написал это перед его редактированием, поэтому потребуется дополнительная работа для этого: – Eric

3

Мне нравится ответ @ LuisCien, потому что OP хочет избежать тегов. Но (a) ответ должен показать, как перейти от кнопки к разделу, независимо от того, насколько глубоко кнопка находится в иерархии представления заголовка, и (b) предоставленный ответ связывает раздел 0 с случаем, когда заголовок не найден (если методу передается представление, не содержащееся в заголовке).

// LuisCien's good suggestion, with modified test and a NotFound return. 

-(NSInteger)sectionNumberForView:(UIView*)view inTableView:(UITableView*)tableView { 

    NSInteger numberOfSections = [tableView numberOfSections]; 

    for(NSInteger i=0; i < numberOfSections; ++i) { 
     UIView *headerView = [tableView headerViewForSection:i]; 
     if ([view isDescendantOfView:headerView]) return i; 
    } 

    return NSNotFound; 
} 

Не нужно называть это просмотром на выходе. Пусть проверка потомков сделает эту работу.

NSInteger section = [self sectionNumberForView:sender inTableView:_yourTableView]; 
+0

headerViewForSection: доступно в iOS 6.0 и более поздних версиях. Даже я тестирую в iOS6, он всегда возвращает (null) –

+0

Можете ли вы опубликовать код, где создается заголовок? – danh

+0

проверить этот вопрос http://stackoverflow.com/questions/16946029/weird-behavior-of-uitableview-method-indexpathforrowatpoint –

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