UIB-кнопки не отключаются правильно - PullRequest
0 голосов
/ 21 сентября 2011

Итак, у меня есть табличное представление с 2 кнопками для каждой ячейки, которые мне удалось пометить индивидуально.Мне нужно, чтобы обе кнопки были отключены после нажатия одной кнопки (функция голосования) Там, где я сейчас нахожусь, кнопки отключаются во время просмотра и не будут нажиматься (хотя цвет шрифта не реагирует вообще, даже если он установлен для UIControlStateDisabled, которыйэто еще одна менее насущная проблема).Однако, когда я прокручиваю вид отключенных кнопок и возвращаюсь, они снова запускают действие при нажатии.Как я могу сохранить это состояние?У меня был массив bools, который назначал бы setEnabled на основе массива, но он работает только наполовину, почти так, как будто я вижу кнопки сверху друг друга, однако шрифт реагирует на этот момент.пожалуйста, помогите. (и я извиняюсь, несмотря на то, что люди говорят, этот сайт ДЕЙСТВИТЕЛЬНО должен переписать свой код вставки кода, целые 4 строки вообще не эффективны)

// Customize the appearance of table view cells.
   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:   
      (NSIndexPath*)indexPath {


static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle   
        reuseIdentifier:CellIdentifier]autorelease];
}

NSDictionary *aTrip = [trips objectAtIndex:[indexPath row]];

cell.textLabel.text =[NSString stringWithFormat:@"%@& *** posted by %@ %@",[aTrip   
    objectForKey:@"txt"],
                      [aTrip objectForKey:@"name"], [aTrip     
    objectForKey:@"time"]];
cell.textLabel.adjustsFontSizeToFitWidth = YES;
cell.textLabel.font = [UIFont systemFontOfSize:12];
cell.textLabel.minimumFontSize = 10;
cell.textLabel.numberOfLines = 4;
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.detailTextLabel.text = [aTrip objectForKey:@"name"];

UIButton *upvote =[UIButton buttonWithType:UIButtonTypeCustom];

UIImage *upVoteBack = [UIImage imageNamed:@"arrowup.png"];
upvote.tag = 2*[indexPath row];
NSLog(@"the tag for upbutton is %d",upvote.tag);
[upvote setBackgroundImage:upVoteBack forState:UIControlStateNormal]; 
upvote.titleLabel.font = [UIFont boldSystemFontOfSize:12.0];
[upvote setTitleColor:[UIColor redColor] forState:UIControlStateDisabled];
[upvote setTitle:[buttonTitles objectAtIndex:[indexPath row]] forState:UIControlStateNormal];
upvote.frame = CGRectMake(250.0f, 40.0f, 25.0f, 25.0f);
[upvote addTarget:self 
      action:@selector(upvoteaction:)forControlEvents:UIControlEventTouchUpInside];
[upvote retain];
[cell addSubview:upvote];


UIButton *downvote =[UIButton buttonWithType:UIButtonTypeCustom];

UIImage *downVoteBack = [UIImage imageNamed:@"arrowdown.png"];
downvote.titleLabel.font = [UIFont boldSystemFontOfSize:12.0];
[downvote setTitle:[buttonTitles2 objectAtIndex:[indexPath row]]       
     forState:UIControlStateNormal];
downvote.tag = 2*[indexPath row]+1;
NSLog(@"the tag for downvote is %d",downvote.tag);
[downvote setBackgroundImage:downVoteBack forState:UIControlStateNormal];
downvote.frame = CGRectMake(280.0f, 40.0f, 25.0f, 25.0f);
[downvote addTarget:self
        action:@selector(upvoteaction:)forControlEvents:UIControlEventTouchUpInside];
[cell addSubview:downvote];


cell.selectionStyle = UITableViewCellSelectionStyleNone;


return cell;

} 


 -(void) upvoteaction:(id) sender{
NSString *upnumber = @"12";
NSString *downnumber = @"5"; 
NSString *upordown;
int k;

if([sender tag]%2){
    upordown = @"2";
    k=-1;
}
else{
    k=1;
    upordown = @"1";
}
NSLog(@"upordown is %@", upordown);

NSLog(@"sender tag is %d",[sender tag]);

NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[sender superview]];



NSDictionary *trip = [trips objectAtIndex:[indexPath row]];

NSString *IDtoUse = [trip objectForKey:@"id"];
IDhold = IDtoUse;

NSString *post =[NSString stringWithFormat:@"id=%@&vote=%@",IDhold, upordown];

NSLog(@"IDhold is %@", IDhold);

NSNumber *wrapped = [NSNumber numberWithBool:NO];

UIButton *button1 = (UIButton *)[[sender superview] viewWithTag:[sender tag]];
button1.enabled = NO;

UIButton *button2 = (UIButton *)[[sender superview] viewWithTag:[sender tag]+k];
button2.enabled = NO;
[buttonTitles replaceObjectAtIndex:[indexPath row] withObject:upnumber];
[buttonTitles2 replaceObjectAtIndex:[indexPath row] withObject:downnumber];

/*
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:@"http://livepartyscene.com/tfln.php?"]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

NSError *error;
NSURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
*/

[self.tableView reloadData];
[IDhold release];

}

1 Ответ

0 голосов
/ 16 августа 2012

Учитывая возраст, я уверен, что вы, вероятно, уже разобрали это, но для вас или кого-либо еще это связано с тем, как iOS кеширует и повторно использует ячейки табличного представления.

Как вы 'вы правильно сделали в коде, вы использовали

dequeueReusableCellWithIdentifier:CellIdentifier

Это очень важно для производительности, но когда он использует ячейку, он также будет повторно использовать свойства.Таким образом, в ячейке, в которой вы отключили свои кнопки, когда они выходят из поля зрения, а затем возвращаются в поле зрения, iOS повторно использует одну из ячеек, которая не используется, и для которых, скорее всего, не отключены кнопки,следовательно, они возвращаются кликабельными.

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

Вы можете исправить это, сохранив, какие кнопки следует отключить в индексе.Если вы используете, скажем, NSArray для своих данных таблиц, которые содержат объекты NSDictionary, вы можете добавить 2 новых ключа в этот словарь, один для состояния каждой из ваших 2 кнопок на ячейку.В этом вы можете просто хранить логическое значение (NSNumber), указывающее, должно ли оно быть отключено или нет.Затем в свой метод cellForRowAtIndexpath добавьте следующий

upVote.enabled = [aTrip objectForKey:@"upVoteEnabled"].boolValue;
downVote.enabled = [aTrip objectForKey:@"downVoteEnabled"].boolValue;

Затем, при каждом нажатии кнопки, убедитесь, что вы обновляете эти клавиши в словаре соответствующим образом.Затем вы ДОЛЖНЫ отключить кнопки только для тех ячеек, которые в этом нуждаются:)

Надеюсь, это поможет вообще.

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