[轉(zhuǎn)載]iOS 不要使用tag傳遞TableViewCell的indexPath值

之前我在項(xiàng)目中總是會(huì)遇到這樣的情況:在UITableViewCell中添加了一個(gè)UIButton济瓢,UIButton點(diǎn)擊后觸發(fā)buttonPress:方法,在方法被調(diào)用后需要知道用戶點(diǎn)擊的是哪一個(gè)Cell纸肉。

原來(lái)我的做法是button.tag = indexPath.section 或者 button.tag = indexPath.row,很簡(jiǎn)單 =蔗彤。= 隱約總覺得這種實(shí)現(xiàn)方式不是正規(guī)做法剖毯,但一直也沒想起來(lái)改。

錯(cuò)誤代碼示范堂淡,請(qǐng)勿模仿:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"testCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        UIButton *avatarBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        [avatarBtn addTarget:self action:@selector(avatarButtonPress:) forControlEvents:UIControlEventTouchUpInside];
        [cell.contentView addSubview:avatarBtn];
    }

    avatarBtn.tag = indexPath.row;  //用button的tag屬性傳遞當(dāng)前cell的row值
    //....
}

- (void)avatarButtonPress:(UIButton*)sender
{
    int row = sender.tag;   //獲得之前設(shè)置的row值
    //....
}

今天我發(fā)現(xiàn)了這樣做的弊端馋缅。

我在TableView中需要實(shí)現(xiàn)一個(gè)刪除操作:點(diǎn)擊Cell中的刪除按鈕后扒腕,刪除當(dāng)前行的Cell,使用動(dòng)畫效果萤悴。

我是這樣實(shí)現(xiàn)的:

- (void)deleteButtonPress:(UIButton*)sender
{
 int section = sender.tag; //使用tag傳遞Cell的indexPath.section值
 
 [_tableView beginUpdates];
 [_tableView deleteSections:[NSIndexSet indexSetWithIndex:section] 
   withRowAnimation:UITableViewRowAnimationLeft];
 [_tableView endUpdates];
}

ok瘾腰,我刪除掉啦,看上去一切良好~

然后程序點(diǎn)擊兩下就崩掉了覆履。蹋盆。。

看了下拋出的異常硝全,說(shuō)代碼中訪問(wèn)了不存在的indexPath.section或row值栖雾。想了想明白了:原來(lái)都是使用UIButton的tag進(jìn)行記錄indexPath值的,但是這種刪除操作執(zhí)行后伟众,UIButton的tag值是不會(huì)更新的析藕,只有在執(zhí)行[_tableView reloadData]方法(或滑動(dòng)列表,這時(shí)會(huì)調(diào)用cellForRowAtIndexPath方法)才能刷新凳厢。

所以這時(shí)TableViewCell中的button.tag值已經(jīng)不對(duì)了噪径!這時(shí)對(duì)Cell做操作,獲得的indexPath值根本不對(duì)数初,程序報(bào)錯(cuò)是必然的找爱。

解決辦法是?

當(dāng)然是使用正規(guī)的辦法獲取indexPath值泡孩!如何做呢车摄?

- (void)deleteButtonPress:(UIButton*)sender
{
 //首先獲得Cell:button的父視圖是contentView,再上一層才是UITableViewCell
 UITableViewCell *cell = (UITableViewCell *)sender.superview.superview;
 
 //然后使用indexPathForCell方法仑鸥,就得到indexPath了~
 NSIndexPath *indexPath = [_tableView indexPathForCell:cell];
}

一點(diǎn)思考

使用tag值傳遞indexPath是一種不安全的做法吮播。因?yàn)樗驮贾抵g沒有“強(qiáng)聯(lián)系”。這就像人傳話眼俊,a直接與b交流沒什么問(wèn)題意狠,但a委托j再委托k再委托l(wèi)傳話給b時(shí),就很難保證不出問(wèn)題疮胖。在上述例子中环戈,就是由于tableView列表中的cell發(fā)生變化,而tag存儲(chǔ)的值是“二手?jǐn)?shù)據(jù)”澎灸,因而給后面的代碼傳值出錯(cuò)院塞,導(dǎo)致最終程序崩潰。所以在程序設(shè)計(jì)時(shí)性昭,要盡量避免使用這種“二手?jǐn)?shù)據(jù)”拦止,一來(lái)保證數(shù)據(jù)正確,二來(lái)減少代碼維護(hù)量。

本文轉(zhuǎn)自Tony's blog 原文網(wǎng)址:http://itony.me/258.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汹族,一起剝皮案震驚了整個(gè)濱河市萧求,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌顶瞒,老刑警劉巖夸政,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異搁拙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)法绵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門箕速,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人朋譬,你說(shuō)我怎么就攤上這事盐茎。” “怎么了徙赢?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵字柠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我狡赐,道長(zhǎng)窑业,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任枕屉,我火速辦了婚禮常柄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搀擂。我一直安慰自己西潘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布哨颂。 她就那樣靜靜地躺著喷市,像睡著了一般。 火紅的嫁衣襯著肌膚如雪威恼。 梳的紋絲不亂的頭發(fā)上品姓,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音箫措,去河邊找鬼缭黔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蒂破,可吹牛的內(nèi)容都是我干的馏谨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼附迷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惧互!你這毒婦竟也來(lái)了哎媚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喊儡,失蹤者是張志新(化名)和其女友劉穎拨与,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艾猜,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡买喧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匆赃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淤毛。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖算柳,靈堂內(nèi)的尸體忽然破棺而出低淡,到底是詐尸還是另有隱情,我是刑警寧澤瞬项,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布蔗蹋,位于F島的核電站,受9級(jí)特大地震影響囱淋,放射性物質(zhì)發(fā)生泄漏猪杭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一妥衣、第九天 我趴在偏房一處隱蔽的房頂上張望胁孙。 院中可真熱鬧,春花似錦称鳞、人聲如沸涮较。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狂票。三九已至,卻和暖如春熙暴,著一層夾襖步出監(jiān)牢的瞬間闺属,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工周霉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掂器,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓俱箱,卻偏偏與公主長(zhǎng)得像国瓮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內(nèi)容...
    i得深刻方得S閱讀 4,640評(píng)論 1 9
  • 2017.02.22 可以練習(xí)乃摹,每當(dāng)這個(gè)時(shí)候禁漓,腦袋就犯困,我這腦袋真是神奇呀孵睬,一說(shuō)讓你做事情播歼,你就犯困,你可不要太...
    Carden閱讀 1,331評(píng)論 0 1
  • *7月8日上午 N:Block :跟一個(gè)函數(shù)塊差不多掰读,會(huì)對(duì)里面所有的內(nèi)容的引用計(jì)數(shù)+1秘狞,想要解決就用__block...
    炙冰閱讀 2,477評(píng)論 1 14
  • 前言 最近忙完項(xiàng)目比較閑,想寫一篇博客來(lái)分享一些自學(xué)iOS的心得體會(huì)蹈集,希望對(duì)迷茫的你有所幫助烁试。博主非科班出身,一些...
    GitHubPorter閱讀 1,422評(píng)論 9 5
  • 最長(zhǎng) token 匹配 注意雾狈,下面進(jìn)入糟糕區(qū)域廓潜,如果看不懂請(qǐng)查看英文原文! S05-metasyntax/long...
    焉知非魚閱讀 373評(píng)論 0 0