亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

UITableViewCell 的重用問題。

UITableViewCell 的重用問題。

慕的地6264312 2019-04-16 20:27:05
我每個cell里面都有一個button,我為button設置了一個點擊響應動作btn_tapped在btn_tapped里面我把sender轉換成button對象,并操作它:比如設置為隱藏。但是發現跟它共用同一個內存button也隱藏起來了。有沒有什么方法可以拿到button并且設置屬性又不沖突的?
查看完整描述

2 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

在復用TableView的時候,一定要從數據源的角度出發。
以咱們這個問題為例,比如,我們的tableView數據源是timelineArray,保存著一個timeline列表。假如Button是“贊”這個按鈕的話,我們之所以要展示這個“贊”按鈕,是因為當前這條timeline中的isLiked(是否被贊)屬性為NO.所以這樣寫:
-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath
{
BtnTableViewCell*cell=(BtnTableViewCell*)[tableViewdequeueReusableCellWithIdentifier:@"BtnTableViewCell"];
NSDictionary*timeline=[self.timelinesobjectAtIndex:indexPath.row];
BOOLisLiked=[[timelineobjectForKey:@"isLiked"]boolValue];
//tableViewCell的樣式是和數據源有關的,所以我們是根據數據源來確定樣式。為了閱讀方便寫成下面這樣,其實是可以寫成一行:cell.likeButton.hidden=!isLiked;
if(isLiked){
cell.likeButton.hidden=YES;
}else{
cell.likeButton.hidden=NO;
}
//我們最好再給button再加一個tag,方便標識之后點擊的時候確定點擊了哪條timeline
cell.likeButton.tag=indexPath.row;
returncell;
}
因為在滑動tableview時,就是通過cellForRowAtIndexPath來復用cell的,所以數據源的改變,cell的樣式也會改變。同時,我們進行任何操作時,本來就會更新數據源的最新狀態,這是最正確的做法。
-(void)btn_tapped:(id)sender
{
if(![senderisKindOfClass:[UIButtonclass]){
return;
}
UIButton*btn=(UIButton*)sender;
//通過tag來獲取到timeline的index
NSIntegerrow=btn.tag;
//【1】立即隱藏該按鈕;
btn.hidden=YES;
//【2】標記數據源,例如保存這條消息已經被贊過了,方便接下來復用cell時識別
NSMutableDictionary*timeline=[self.timelinesobjectAtIndex:row];
[timelinesetObject:[[NSNumberalloc]initWithBool:YES]forKey:@"isLiked"];
}
                            
查看完整回答
反對 回復 2019-04-16
  • 2 回答
  • 0 關注
  • 287 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號