2012-03-06 3 views
3

Я разрабатываю приложение iOS 4 с последними версиями SDK и XCode 4.2.Пользовательский UITableViewCell с UIButton: какая кнопка нажата?

У меня есть UITableView с разделами и с пользовательскими UITableViewCell. Каждая ячейка имеет UIButton, и все эти кнопки имеют ту же цель для UIControlEventTouchUpInside.

Это мой код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString* cellIdentifier = @"CalendarCell"; 

    CalendarEventCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (cell == nil) 
    { 
     NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CalendarEventCell" owner:nil options:nil]; 

     for(id currentObject in topLevelObjects) 
     { 
      if ([currentObject isKindOfClass:[CalendarEventCell class]]) 
      { 
       cell = (CalendarEventCell *)currentObject; 
       [cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal) forControlEvents:UIControlEventTouchUpInside]; 
       break; 
      } 
     } 
    } 
... 
} 

Когда сенсорный пользователь внутри этой кнопки как я могу знать, на какую часть и ряд была ячейкой, которая была нажата?

+1

Вы можете установить тег для этой кнопки.Используя этот номер тега, вы можете узнать, какая кнопка нажата. – Ganesh

+0

смотрите здесь: http://stackoverflow.com/questions/510393/how-to-pass-a-variable-to-a-uibutton-action – pkyeck

ответ

6

Поместите тег на кнопку. Например:

CalendarEventCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

if (cell == nil) 
{ 
    NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CalendarEventCell" owner:nil options:nil]; 

    for(id currentObject in topLevelObjects) 
    { 
     if ([currentObject isKindOfClass:[CalendarEventCell class]]) 
     { 
      cell = (CalendarEventCell *)currentObject; 
      [cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal) forControlEvents:UIControlEventTouchUpInside]; 
      break; 
     } 
    } 
} 
cell.addToCalendarButton.tag = ((indexPath.section & 0xFFFF) << 16) | 
           (indexPath.row & 0xFFFF); 

Вам нужно будет изменить селектор @selector(addEventToiCal:) и обновить метод -(void) addEventToiCal:(UIButton *)sender.

Вы можете добавить что-то вроде цели следующего -addEventToiCal:

if (!([sender isKindOfClass:[UIButton class]])) 
    return; 
NSUInteger section = ((sender.tag >> 16) & 0xFFFF); 
NSUInteger row  = (sender.tag & 0xFFFF); 
NSLog(@"Button in section %i on row %i was pressed.", section, row); 
+0

Вы также можете объявить метод как '- (void) addEventToiCal: (UIButton *), а затем удалите первую строку. –

+0

@MisterJack Я обсуждал это так. Поскольку вы, похоже, запомнили эту идею, я обновил ответ, чтобы отразить ваше предложение. –

+0

Спасибо за ваш ответ. Мне понадобится indexPath.section и indexPath.row. – VansFannel

3

кнопку Set для метода в ячейке вместо установки мишени до самого контроллера, создать протокол делегата для ячейки с методом например tappedButton:(UIButton *)button inCell:(UITableViewCell *)cell и установите контроллер как делегат ячейки. В целевом методе вызывается метод delegate.

Затем в реализации метода делегата контроллера вы можете узнать номер ячейки NSIndexPath, позвонив по номеру UITableViewtableView:indexPathForCell:.

+0

Может быть проще передать раздел и строку методу 'tappedButton:' вместо вызова 'tableView: indexPathForCell:', не так ли? – VansFannel

+0

Затем вам нужно удерживать ячейку 'NSIndexPath' как ее ivar/property - это также возможно. Но вы ненужно дублируете данные, которые вам нужно поддерживать дополнительно, - отпустите его, когда ядро ​​умирает, обновите его, например, ячейки выше добавляются или удаляются и так далее. Однако, если вы столкнулись с проблемами производительности, запустив 'tableView: indexPathForCell:', что маловероятно, вы можете использовать этот «ярлык», конечно. – macbirdie

2

Присвоить значение Tag на кнопку, как, что в cellForRowAtIndexPath методы

  1. cell.addToCalendarButton.tag=indexPath.row
  2. При добавлении метод кнопки также послать отправитель так назначить метод кнопку, как это.

    [cell.addToCalendarButton addTarget: self action: @selector (addEventToiCal:) forControlEvents: UIControlEventTouchUpInside];

  3. В вашем методе чтение соответствующей строки как это

    - (IBAction) addEventToiCal: (ID) отправитель { NSLog ("текущая строка% d", [отправитель теги]); }

Если вы хотите теперь о разделе затем indexPath сделать такую ​​вещь, то

- (void)addEventToiCal:(id)sender event:(id)event 
{ 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; 

    NsLog("value of indePath.section %d ,indexPath.row %d",indexPath.section,indexPath.row); 

} 

назначьте метод в cellforRowAtIndexPath Как это.

[cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal:event:)forControlEvents:UIControlEventTouchUpInside]; 
+0

Спасибо за ваш ответ. Мне понадобится indexPath.section и indexPath.row. – VansFannel

0

BNRXIBCell - отличное решение для iOS 5 и выше. Это подкласс UITableViewCell, предназначенный для подкласса, для пересылки сообщений о действиях из подзонов ячеек в контроллер.

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