2014-10-13 3 views
1

Я пытаюсь добраться до указателя индекса кнопки в правильно заполненном UITableView. У меня есть две метки и одна кнопка в каждой ячейке, настроенной в другом XIB. Когда я нажимаю кнопку в любой строке в любом разделе, она возвращает mw неправильный путь указателя. Мне интересно, что может вызвать это. Ниже вы можете найти мой код.UIButton indexpath возвращает неправильный путь в UITableView

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

    ProgramCell *cell = (ProgramCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

    if (cell == nil) 
    { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProgramCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
    } 
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
    [cell.contentView setUserInteractionEnabled: NO]; // 


    NSString* strTemp = [NSString stringWithFormat: @"%d/%d", indexPath.section, indexPath.row ]; 

    for (int i = 0; i < buttonClickedArray.count; i++) { 

     if([[buttonClickedArray objectAtIndex:i] isEqualToString:strTemp]) 
     { 
      [cell.btnHatirlat setBackgroundColor:[UIColor colorWithRed:0.0 green:0.5 blue:0. alpha:0.7]]; 
      [cell.btnHatirlat setTitle:@"Eklendi" forState:UIControlStateNormal]; 
     } 
    } 

    NSString *str = @""; 
    str = [arrayPazartesi objectAtIndex:indexPath.row]; 


    if ([str length] > 1) 
    { 
     NSString *strSaat = [str substringToIndex:5]; 
     NSString *strEtkinlikAdi = [str substringFromIndex:6]; 
     cell.lblEtkinlik.text = strEtkinlikAdi; 
     cell.lblSaat.text = strSaat; 
     [cell.btnHatirlat addTarget:self action:@selector(hatirlat:) 
        forControlEvents:UIControlEventTouchUpInside ]; 
    } 

    return cell; 
} 

- (void) hatirlat:(UIButton *)sender 
{  
    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableProgram]; 
    NSIndexPath *indexPath = [self.tableProgram indexPathForRowAtPoint:buttonPosition]; 
    int j = indexPath.section; //true section 
    int i = indexPath.row; //wrong row 
} 
+0

Вы можете представить пример вывода, который вы получаете, и ожидаемого. Например, это всегда 1 от того, что вы ищете. Или это полностью случайно –

+0

, он возвращает индекс первых двух строк как 0 в каждом разделе. следующие строки продолжаются от 1. как индекс 3-й строки -> 1, 4-й -> 2 – birdcage

ответ

5

Я видел эту проблему раньше (но не могу найти ссылку), и исправление было не выбрать угол (я думаю, что это будет проблемой только в том случае, если кнопка находится прямо в верхней части ячейки). Вместо того,

CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableProgram]; 

Попробуйте это, чтобы убедиться, что вы не правы на краю,

CGPoint boundsCenter = CGRectOffset(sender.bounds, sender.frame.size.width/2, sender.frame.size.height/2).origin; 
CGPoint buttonPosition = [sender convertPoint:boundsCenter toView:self.tableView]; 
+0

К сожалению, это решение не работает в моем случае. – birdcage

+0

@ gbesler, дает ли тот же результат, который вы получаете с кодом? – rdelmar

+0

он возвращает 0 для каждого значения indexpath.row. – birdcage

0

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

CGPoint point = [self.tableView convertPoint:sender.frame.origin fromView:sender.superview]; 
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:point]; 

Редактировать

Предпочтительный способ сделать это будет иметь ячейка создания кнопки (возможно, во время инициализации). И определите протокол для этой ячейки, который возвращает ссылку на ячейку. Установите ячейку в качестве кнопки делегата и когда кнопка нажата, передать ссылку на ячейку обратно в камеру делегата, который может вызвать

NSIndexPath *indexPath = [tableView indexPathForCell:cell]; 

например,

UITableViewCell.h

@protocol MyCellDelegate <NSObject> 

@optional 
- (void)cell:(UITableViewCell *)cell buttonPressed:(UIButton *)button; 

@end 


@interface MyCell : UITableViewCell 

@property (weak, nonatomic) id<MyCellDelegate> delegate; 

UITableViewCell.m

- (void)setDataWithDictionary:(NSDictionary *)dictionary 
{ 
    [self.titleLbl setText:[dictionary objectForKey:@"title"]]; 
    [self.amountLbl setText:[dictionary objectForKey:@"amount"]]; 

    btn = [[UIButton alloc] init]; 
    [btn addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside]; 
    ..... 
} 

- (void)buttonPressed 
{ 
    if(self.delegate) 
    { 
     if([self.delegate respondsToSelector:@selector(cell:buttonPressed:)]) 
     { 
      [self.delegate cell:self buttonPressed:btn]; 
     } 
    } 
} 
+0

Тем не менее. в каждом разделе первые две строки, индексы строк равны 0. Индекс строки третьей строки равен 1 и продолжается как 2,3,4 в следующих строках. – birdcage

+0

возможно попробуйте назначить тег кнопок как строку в 'cellForRowAtIndexPath:' и использовать приведенный выше метод для получения раздела? довольно храбрый, я не просто сплевываю идеи –

+0

@gbesler также вижу мое редактирование –

0

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

Возможно, это вызовет проблему из-за ваших двух UITableViews, но я точно не знаю ваш код.

- (void) hatirlat:(UIButton *)sender{ 
    UIButton *button = (UIButton *)sender; 
    _arrayForPosition[button.tag]; 
} 
Смежные вопросы