Пользовательский UITableViewCell с UIButton: какая кнопка была нажата? - PullRequest
3 голосов
/ 06 марта 2012

Я разрабатываю приложение для iOS 4 с последним SDK и XCode 4.2.

У меня есть UITableView с разделами и с пользовательскими UITableViewCell. У каждой ячейки есть кнопка UIB, и все эти кнопки имеют одинаковую цель для 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;
            }
        }
    }
...
}

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

Ответы [ 4 ]

6 голосов
/ 06 марта 2012

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

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);
3 голосов
/ 06 марта 2012

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

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

2 голосов
/ 06 марта 2012

Назначить значение тега кнопке, как это в cellForRowAtIndexPath method

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

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

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

    - (IBAction) addEventToiCal: (id) sender {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 голосов
/ 30 ноября 2012

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

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