2014-12-01 2 views
0

У меня есть кнопка, как в tableviewcellDetect на кнопку, которую нужно изменить текст в ячейке

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 


    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; 

     DBImageView *imageView = [[DBImageView alloc] initWithFrame:(CGRect){ 0, 0, 320, 320 }]; 
     [imageView setPlaceHolder:[UIImage imageNamed:@"Placeholder"]]; 
     [imageView setTag:101]; 
     [cell.contentView addSubview:imageView]; 
    } 


    NSDictionary *tmpDict = [myObject objectAtIndex:indexPath.row]; 
    [(DBImageView *)[cell viewWithTag:101] setImageWithPath:[tmpDict objectForKey:@"thumb_link"]]; 


    likeButton = [UIButton buttonWithType:UIButtonTypeCustom] ; 
    [likeButton setFrame:CGRectMake(cell.frame.size.width-60,280,81,33)]; 
    likeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; 
    likeButton.contentEdgeInsets = UIEdgeInsetsMake(3, 2, 0, 0); 
    [likeButton.titleLabel setFont:[UIFont fontWithName:@"Trebuchet MS" size:16]]; 
    [likeButton setBackgroundImage:[UIImage imageNamed:@"heart.png"] forState:UIControlStateNormal]; 
    [likeButton setBackgroundImage:[UIImage imageNamed:@"heart_pressed.png"] forState:UIControlStateSelected]; 
    [cell addSubview:likeButton]; 


    // like button 
    likeButton.selected = ![likeButton isSelected]; 
    NSInteger defaultKey2 = [[NSUserDefaults standardUserDefaults] integerForKey:[tmpDict objectForKey:@"id"]]; 
    if (defaultKey2 == 0) 
    { 
     //[likeButton setTitleColor:[UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:1.0] forState:UIControlStateNormal]; 
     [likeButton setSelected:NO]; 
    } 
    else if (defaultKey2 == 1) 
    { 
     //[likeButton setTitleColor:[UIColor colorWithRed:229/255.0 green:85/255.0 blue:140/255.0 alpha:1.0] forState:UIControlStateNormal]; 
     [likeButton setSelected:YES]; 
    } 


    [likeButton setTitle:[tmpDict objectForKey:@"likes"] forState:UIControlStateNormal]; 
    [likeButton addTarget:self action:@selector(like:) forControlEvents: UIControlEventTouchUpInside]; 
    [likeButton setTag:indexPath.row]; 

    return cell; 

} 

Это мое действие:

-(void)like:(id) sender{ 
    UIButton *likebtn = (UIButton *)sender; 
    NSDictionary *tmpDict = myObject[likebtn.tag]; 
    NSInteger defaultKey2 = [[NSUserDefaults standardUserDefaults] integerForKey:[tmpDict objectForKey:@"id"]]; 
    if (defaultKey2 == 0) 
    { 
     //Increase value 
     int varTemp = [[tmpDict objectForKey:@"likes"] intValue]+1; 
     NSString *strValue = [NSString stringWithFormat:@"%d", varTemp]; 
     [likeButton setTitle:strValue forState:UIControlStateNormal]; 
     NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
     [prefs setInteger:1 forKey:[tmpDict objectForKey:@"id"]]; 
     [[NSUserDefaults standardUserDefaults]synchronize]; 
    } 
    if (defaultKey2 == 1) 
    { 
     //Decrease value 
     int varTemp = [[tmpDict objectForKey:@"likes"] intValue]-1; 
     NSString *strValue = [NSString stringWithFormat:@"%d", varTemp]; 
     [likeButton setTitle:strValue forState:UIControlStateNormal]; 
     NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
     [prefs setInteger:0 forKey:[tmpDict objectForKey:@"id"]]; 
     [[NSUserDefaults standardUserDefaults]synchronize];  
    } 
    NSIndexPath *tmpIndexpath=[NSIndexPath indexPathForRow:likebtn.tag inSection:0]; 
    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:tmpIndexpath, nil] withRowAnimation:UITableViewRowAnimationNone]; 
} 

Когда я пытаюсь установить название для моей кнопки в ячейке [likeButton setTitle:strValue forState:UIControlStateNormal]; значение переходит в неправильную ячейку.

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

+1

Что значит «значение идет в неправильную ячейку»? И не могли бы вы отправить свой код из cellForRowAtIndexPath? –

+0

Мне нужно увеличить или уменьшить значение моего значения, когда я нажимаю кнопку, изменяя значение в неправильной ячейке. –

+0

ОК, пара вещей ... В вашем 'like:' методе, где «likeButton» исходит из условных выражений? Потому что вы объявили «likebtn» в начале метода. Во-вторых, вы не можете установить заголовок кнопки таким образом. Он должен быть установлен в cellForRowAtIndexPath. Я опубликую предложение вскоре после того, как вы объясните, где было объявлено «likeButton». –

ответ

1

Вы не можете установить заголовок кнопки, которая, как в методе like:, то есть:

[likeButton setTitle:strValue forState:UIControlStateNormal]; 

(1) Потому что вы перезагрузки таблицы сразу после этого, таким образом, вручную вызвав вызов cellForRowAtIndexPath: и (2), даже если вы не перезагрузили данные таблицы, даже прокрутка вызовет вызов cellForRowAtIndexPath, и, таким образом, ваши ячейки будут заполнены на основе информации cellForRowAtIndexPath:.

Как она стоит сейчас, ваш метод cellForRowAtIndexPath: использует следующую строку, чтобы установить название:

[likeButton setTitle:[tmpDict objectForKey:@"likes"] forState:UIControlStateNormal]; 

Это означает, что для того, чтобы like: действие, чтобы вызвать изменение заголовка, вы должны изменить [ tmpDict objectForKey: @ "любит"] значение в like:. Поскольку вы используете временный словарь и никогда не добавляете словарь обратно в массив myObject, вы не изменили значение, которое в конечном итоге решит название вашей кнопки в cellForRowAtIndexPath:. Таким образом, вы должны соответствующим образом обновить myObject. Вот мой код предложение:

-(void)like:(id)sender { 

    UIButton *likebtn = (UIButton *)sender; 
    NSMutableDictionary *tmpDict = myObject[likebtn.tag]; 
    NSInteger defaultKey2 = [[NSUserDefaults standardUserDefaults] integerForKey:[tmpDict objectForKey:@"id"]]; 

    if (defaultKey2 == 0) 
    { 
     //Increase value 
     int varTemp = [[tmpDict objectForKey:@"likes"] intValue]+1; 

     // Then update myObject 
     [tmpDict setObject:[NSString stringWithFormat:@"%d", varTemp] forKey:@"likes"]; 
     [myObject replaceObjectAtIndex:likebtn.tag withObject:tmpDict]; 

     NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
     [prefs setInteger:1 forKey:[tmpDict objectForKey:@"id"]]; 
     [[NSUserDefaults standardUserDefaults]synchronize]; 
    } 
    if (defaultKey2 == 1) 
    { 
     //Decrease value 
     int varTemp = [[tmpDict objectForKey:@"likes"] intValue]-1; 

     // Then update myObject 
     [tmpDict setObject:[NSString stringWithFormat:@"%d", varTemp] forKey:@"likes"]; 
     [myObject replaceObjectAtIndex:likebtn.tag withObject:tmpDict]; 


     NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
     [prefs setInteger:0 forKey:[tmpDict objectForKey:@"id"]]; 
     [[NSUserDefaults standardUserDefaults]synchronize];  
    } 

    NSIndexPath *tmpIndexpath=[NSIndexPath indexPathForRow:likebtn.tag inSection:0]; 
    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:tmpIndexpath, nil] withRowAnimation:UITableViewRowAnimationNone]; 

} 

Edit: Кроме того, есть теперь большая проблема, которую я видел ваш метод cellForRowAtIndexPath:. Вы объявили кнопку как переменную класса? (1) Не делайте этого. Храните его местным, например:

UIButton *likeButton = [UIButton buttonWithType:UIButtonTypeCustom] ; 

(2) Вы повторно используете свои ячейки, но каждый раз добавляете новую кнопку. Таким образом, вы добавляете одну кнопку поверх другой поверх другого с каждым вызовом cellForRowAtIndexPath:. Это может вызвать проблемы для вас.

+0

*** Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: '- [__ NSCFNumber length]: непризнанный селектор, отправленный в экземпляр 0x15768450 ' –

+0

@PavelKaljunen Хм ... Я не совсем уверен, почему это так. Но я изменил код и разбил эту строку на два отдельных шага. Он работает сейчас? –

+0

Нет видимого @interface для 'NSDictionary' объявляет селектор 'setObject: forKey:' –

0

Ваша ячейка может повторно использовать кнопки и теги могут быть беспорядочными. Попробуйте обновить теги ваших бойцов в таблицеView: willDisplayCell: forRowAtIndexPath: метод.

+0

На данный момент у меня есть reuseIdentifier: nil –

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