iOS 自定義Cell按鈕的點擊代理事件

在實際開發工作中,我們經常會在自定義的Cell中布局一些按鈕,并且很多時候我們會在點擊這個按鈕的時候使我們的UItableviewController跳轉到下一界面,有的可能還要傳值。那么如何使我們的控制器能夠獲知我們按下了cell的按鈕呢?毫無疑問,這是個代理模式的典型應用場景。

首先我們先得定義一個cell。.h文件如下:

[objc]?view plain?copy
?在CODE上查看代碼片派生到我的代碼片
  1. @protocol?MycellDelegate?<NSObject>??
  2. ??
  3. @optional??
  4. -(void)didClickButton:(UIButton?*)button;??
  5. ??
  6. @end??
  7. ??
  8. @interface?Mycell?:?UITableViewCell??
  9. ??
  10. +(instancetype)cellWithtableView:(UITableView?*)tableview;??
  11. ??
  12. @property(nonatomic,strong)DateModel?*model;??
  13. ??
  14. @property(nonatomic,weak)?id<MycellDelegate>?delegate;??

.m文件如下:

[objc]?view plain?copy
?在CODE上查看代碼片派生到我的代碼片
  1. #import?"Mycell.h"??
  2. ??
  3. @interface?Mycell()??
  4. ??
  5. @property(nonatomic,strong)UIButton?*button;??
  6. ??
  7. @end??
  8. ??
  9. @implementation?Mycell??
  10. ??
  11. +(instancetype)cellWithtableView:(UITableView?*)tableview??
  12. {??
  13. ????static?NSString?*ID?=?@"cell";??
  14. ????Mycell?*cell?=?[tableview?dequeueReusableCellWithIdentifier:ID];??
  15. ????if(!cell)??
  16. ????{??
  17. ????????cell?=?[[Mycell?alloc]initWithStyle:UITableViewCellStyleDefault?reuseIdentifier:ID];??
  18. ????????cell.selectionStyle?=?UITableViewCellSelectionStyleNone;??
  19. ????????cell.textLabel.font?=?[UIFont?systemFontOfSize:13.0];??
  20. ????}??
  21. ????return?cell;??
  22. ??????
  23. }??
  24. ??
  25. ??
  26. //重寫布局??
  27. -(instancetype)initWithStyle:(UITableViewCellStyle)style?reuseIdentifier:(NSString?*)reuseIdentifier??
  28. {??
  29. ????self?=?[super?initWithStyle:style?reuseIdentifier:reuseIdentifier];??
  30. ????if(self)??
  31. ????{??
  32. ????????self.button?=?[[UIButton?alloc]?initWithFrame:CGRectMake(0,?0,?[UIScreen?mainScreen].bounds.size.width,?self.frame.size.height)];??
  33. ????????[self.button?setTitle:@"我是按鈕點我"?forState:UIControlStateNormal];??
  34. ????????[self.button?setTitleColor:[UIColor?redColor]?forState:UIControlStateNormal];??
  35. ????????self.button.contentHorizontalAlignment?=?UIControlContentHorizontalAlignmentRight;??
  36. ????????self.button.titleLabel.font?=?[UIFont?systemFontOfSize:12.0];??
  37. ????????[self.contentView?addSubview:self.button];??
  38. ????????[self.button?addTarget:self?action:@selector(btnClick:)?forControlEvents:UIControlEventTouchUpInside];??
  39. ????}??
  40. ????return?self;??
  41. }??
  42. ??
  43. ??
  44. //給cell控件賦值??
  45. -(void)setModel:(DateModel?*)model??
  46. {??
  47. ????self.textLabel.text?=?[NSString?stringWithFormat:@"日期:%@、信息:%@",model.date,model.message];??
  48. ??????
  49. }??
  50. ??
  51. #pragma?mark?-?按鈕點擊事件,通過代理模式響應??
  52. -(void)btnClick:(UIButton?*)btn??
  53. {??
  54. ????[self.delegate?didClickButton:btn];??
  55. }??
  56. ??
  57. @end??

上述代碼定義了一個代理,當按下按鈕時,代理響應。

現在回到UItableviewController,代碼如下:

[objc]?view plain?copy
?在CODE上查看代碼片派生到我的代碼片
  1. -(UITableViewCell?*)tableView:(UITableView?*)tableView?cellForRowAtIndexPath:(NSIndexPath?*)indexPath??
  2. {??
  3. ????Mycell?*cell?=?[Mycell?cellWithtableView:tableView];??
  4. ????cell.model?=?self.Array[indexPath.row];??
  5. ????cell.delegate?=?self;??
  6. ????return?cell;??
  7. }??

別忘了.delegate = self哦!代理執行的代碼如下:

[objc]?view plain?copy
?在CODE上查看代碼片派生到我的代碼片
  1. #pragma?mark?-?代理事件??
  2. //跳轉到下一界面并傳值??
  3. -(void)didClickButton:(UIButton?*)button??
  4. {??
  5. ????Mycell?*cell?=?(Mycell?*)button.superview.superview;??
  6. ????NSIndexPath?*indexPath?=?[self.tableView?indexPathForCell:cell];??
  7. ????MessageController?*vc?=?[[MessageController?alloc]init];??
  8. ????DateModel?*model?=?self.Array[indexPath.row];??
  9. ????vc.message?=?[NSString?stringWithFormat:@"行號:第%ld行,日期:%@、信息:%@",(long)indexPath.row,model.date,model.message];??
  10. ????[self.navigationController?pushViewController:vc?animated:YES];??
  11. }??

當我們的cell中按鈕點擊后,將會自動跳到這個代理方法中,我們獲取到按鈕所在的cell,通過indexPathforCel這個方法(系統API)可以獲取到cell的行數,并拿到數據源,此時想要傳值給下一個界面就變的非常簡單。


特別提醒:

當同一個工廠方法創建多行cell中的button時,要分別做處理的話需要分別對應cell的button添加tag,設置代理事件時,通過tag值來區分

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247904.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247904.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247904.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Google 開源技術protobuf 簡介與樣例

今天來介紹一下“Protocol Buffers ”&#xff08;以下簡稱protobuf&#xff09;這個玩意兒。本來俺在構思“生產者/消費者模式 ”系列的下一個帖子&#xff1a;關于生產者和消費者之間的數據傳輸格式。由于里面扯到了protobuf&#xff0c;想想干脆單獨開一個帖子算了。 ★prot…

VUE全局導航守衛、 請求、響應攔截器 的設置

文件設置參考地址&#xff1a;https://gitee.com/wang_yu5201314/headlines__news/tree/master/%E9%A1%B9%E7%9B%AE%E6%BA%90%E7%A0%81%E6%96%87%E4%BB%B6/src 文件夾 Router 文件夾 index.js 中設置 全局導航守衛 文件 mian.js 中設置 請求、響應攔截器 設置 請求、響應攔截器…

JRE System Library和 Referenced Libraries 的區別和來源

JRE System Library 安裝jdk后&#xff0c;會有個目錄叫做jrejre目錄是核心類庫&#xff0c;目錄中裝的是類庫文件jre System Library顧名思義就表示系統類庫文件 Referenced Libraries referenced libraries放的是你引用的jar包&#xff0c;這個不需要自己創建的&#xff0c;你…

ByteArray、16進制、字符串之間的轉換

ByteArray、16進制、字符串之間的轉換&#xff1a; package fengzi.convert {import flash.utils.ByteArray;public class ByteArrayTranslated{/**** 通過hax數據返回ByteArray* param hax 格式 "AA5A000100FF"***/public static functi…

js - (初中級)常見筆試面試題

1.用 js 實現一個深拷貝 2.用 js 寫一個數組去重 3. 用 js 對字符串進行反轉 4. 用 js 請求范圍內的質數個數 5.用 js 求數組中出現最多的數及其出現次數

iOS 支付寶SDK接入詳解

一&#xff0c;在支付寶開放平臺下載支付寶SDK&#xff08;https://openhome.alipay.com/platform/document.htm#down&#xff09; https://doc.open.alipay.com/doc2/detail.htm?spma219a.7629140.0.0.HpDuWo&treeId54&articleId104509&docType1 二&#xff0c;添…

面試基本知識點

文章目錄面-什么是SEO面 - cookie / localstorage / sessionstorage的區別面 - promise面試題面 - 柯里化函數面 - 函數節流面 - 函數防抖HTML / CSS 知識點1、講講盒模型&#xff08;螞蟻金服 2019.03 招行信用卡 2019.04 美團 作業幫&#xff09;2、根據盒模型解釋邊距重疊&a…

Redis 熱點key

壓測報redis 熱點問題 熱點問題概述 產生原因 熱點問題產生的原因大致有以下兩種&#xff1a; 用戶消費的數據遠大于生產的數據&#xff08;熱賣商品、熱點新聞、熱點評論、明星直播&#xff09;。 在日常工作生活中一些突發的的事件&#xff0c;例如&#xff1a;雙十一期間某些…

移動IM開發那些事:技術選型和常見問題

最近在做一個iOS IM SDK&#xff0c;在內部試用的階段&#xff0c;不斷有兄弟部門或者合作伙伴過來問各種技術細節&#xff0c;所以統一寫一篇文章記錄&#xff0c;統一介紹下一個IM APP的方方面面&#xff0c;包括技術選型(包括通訊方式,網絡連接方式,協議選擇)和常見問題。 …

webstrom打開通過頂部瀏覽器打開網頁,被跳轉到默認主頁

重新開始工作啦&#xff0c;希望以后認真一點&#xff0c;并把遇到的問題都記錄下來&#xff0c;雖然是小小白&#xff0c;但能無意間幫助到別人就更開心了呀 通過webstrom打開本地的文件時&#xff0c;發現跳轉到了默認主頁上&#xff0c;吐槽下&#xff0c;有些主頁真的超級流…

mockjs(接口服務代理)

mock官網&#xff1a;http://mockjs.com/ 一、搭建一個練習項目 1.利用vue的項目腳手架進行搭建 命令&#xff1a; vue create mock-demo 截圖&#xff1a; 2.安裝相關的依賴 命令&#xff1a; #使用 axios 發送 ajax npm install axios --save #使用 mock.js 產生隨機數據…

MD5算法原理

MD5&#xff08;單向散列算法&#xff09; 的全稱是Message-Digest Algorithm 5&#xff08;信息-摘要算法&#xff09;&#xff0c;經MD2、MD3和MD4發展而來。MD5算法的使用不需要支付任何版權費用。MD5功能&#xff1a;輸入任意長度的信息&#xff0c;經過處理&#xff0c;輸…

函數-函數進階-裝飾器流程分析

老王&#xff1a;算了&#xff0c;估計你也想不出來。。。學過嵌套函數沒有&#xff1f; 你&#xff1a;yes&#xff0c;然后呢&#xff1f; 老王&#xff1a;想實現一開始你寫的america login(america)不觸發你函數的執行&#xff0c;只需要在這個login里面再定義一層函數&am…

制作手寫簽名

<!DOCTYPE html> <!-- saved from url(0056)http://hao2013.cn/canvas-special-master/brush/index.html --> <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>簽名板(支持移動…

python第五次作業——陳靈院

習題1&#xff1a;讀入文件pmi_days.csv&#xff0c;完成以下操作&#xff1a;1.統計質量等級對應的天數&#xff0c;例如&#xff1a;優&#xff1a;5天良&#xff1a;3天中度污染&#xff1a;2天2.找出PMI2.5的最大值和最小值&#xff0c;分別指出是哪一天。 import csv impo…

iOS 二叉樹相關算法實現

什么是二叉樹&#xff1f; 在計算機科學中&#xff0c;二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”和“右子樹”&#xff0c;左子樹和右子樹同時也是二叉樹。二叉樹的子樹有左右之分&#xff0c;并且次序不能任意顛倒。二叉樹是遞歸定義的&#xff0c;所…

vux 組件庫首次使用安裝

1、首先通過腳手架新建一個項目&#xff0c;過程略。 創建完項目后&#xff0c;在項目里安裝vux&#xff0c; 通過命令 npm install vux --save 安裝 2、安裝vux-loader&#xff0c; 通過命令 npm install vux-loader --save-dev 安裝&#xff08;vux文檔沒說明&#xff09; 3、…

@Component 和 @Bean 的區別

Spring幫助我們管理Bean分為兩個部分&#xff0c;一個是注冊Bean&#xff0c;一個裝配Bean。完成這兩個動作有三種方式&#xff0c;一種是使用自動配置的方式、一種是使用JavaConfig的方式&#xff0c;一種就是使用XML配置的方式。 Compent 作用就相當于 XML配置 Component pub…

js動態驗證碼獲取

<!DOCTYPE html> <html lang"cn"> <head><meta charset"UTF-8"><title>短信驗證碼</title> </head> <body> <input type"number" id"tel" value"13303861063"> <…

Base64 算法原理,以及編碼、解碼【加密、解密】 介紹

Base64編碼&#xff0c;是我們程序開發中經常使用到的編碼方法。它是一種基于用64個可打印字符來表示二進制數據的表示方法。它通常用作存儲、傳輸一些二進制數據編碼方法&#xff01;也是MIME&#xff08;多用途互聯網郵件擴展&#xff0c;主要用作電子郵件標準&#xff09;中…