[Swift通天遁地]二、表格表单-(7)电子邮件Mail:实现单元格左右滑动调出功能按钮

[Swift通天遁地]二、表格表单-(7)电子邮件Mail:实现单元格左右滑动调出功能按钮,第1张

概述本文将演示对单元格进行扩展,当手指在单元格左右滑动时,d出不同的功能菜单。 Github项目:【MGSwipeTableCell】 下载该项目的源代码。文件夹【demo】->文件夹【MailAppDemoSwift】->文件夹【MailAppDemoSwift】 ->双击文件【MailAppDemoSwift。xcodeproj】打开示例工程。 选择该项目中的几个文件,拖动到自己的开发项目中。按住

本文将演示对单元格进行扩展,当手指在单元格左右滑动时,d出不同的功能菜单。

Github项目:【MGSwipeTableCell】

下载该项目的源代码。文件夹【demo】->文件夹【MailAppDemoSwift】->文件夹【MailAppDemoSwift】

->双击文件【MailAppDemoSwift。xcodeproj】打开示例工程。

选择该项目中的几个文件,拖动到自己的开发项目中。按住【Shift】,选择

【MGSwipebutton.h】

【MGSwipebutton.m】

【MGSwipetableCell.h】

【MGSwipetableCell.m】

按下【Command】,以选择其他不相邻的文件。

【MailVIEwController.swift】

【MailtableCell.swift】

【ObjCBrIDgingheader.h】

将上面选择的7个文件拖动到自己的项目中。

->保持默认的设置选项,点击【Finish】

接着对项目进行一些设置,以引入桥接文件。

点击项目名称【DemoApp】->【Buildings】->桥接文件配置区域【Object-C BrIDging header】

->在配置选项中双击,打开配置窗口。

->在配置窗口中,输入刚刚导入的桥接文件的名称:【DemoApp/ObjCBrIDgingheader.h】

在项目导航区,打开视图控制器的代码文件【VIEwController.swift】

现在开始编写代码,创建一个可通过左右滑动,来调出功能按钮的表格

  1 import UIKit  2   3 //添加一个邮件数据类,这个类将用来表示表格中的数据  4 class MailData  5 {  6     //给类添加四个属性:  7     //1.来源  8     var from: String!  9     //2.主题 10     var subject: String! 11     //3.内容 12     var message: String! 13     //4.日期 14     var date: String! 15     //添加两个属性 16     //1.邮件是否已被阅读 17     var read = false 18     //2.邮件是否拥有标记 19     var flag = false 20 } 21  22 //创建一个别名,表示功能按钮被点击时所执行的方法的类型。 23 typealias MailActionCallback = (_ cancelled: Bool,_ deleted: Bool,_ actionIndex: Int) -> VoID 24  25 //使当前的视图控制器类,遵循: 26 //1.表格的数据源协议UItableVIEwDataSource 27 //2.表格视图代理协议UItableVIEwDelegate 28 //3.滑动表格单元格代理协议 29 //4.动作表单协议 30 class VIEwController: UIVIEwController,UItableVIEwDataSource,UItableVIEwDelegate,MGSwipetableCellDelegate,UIActionSheetDelegate 31 { 32     //添加一个表格视图类型的变量,作为当前类的一个属性 33     var tableVIEw: UItableVIEw! 34     //创建一个邮件数据类型的数组,作为表格的数据源 35     var demoData = [MailData]() 36     //使用刚刚创建的别名,创建一个动作类型 37     var actionCallback: MailActionCallback? 38      39     //添加一个方法,用来设置表格的数据源 40     func prepareDemoData() 41     { 42         //创建第一个字符串数组常量,作为邮件的来源 43         var from = [ 44             "vincent", 45             "Mr Glass", 46             "Marsellus", 47             "Ringo", 48             "Sullivan" 49         ] 50          51         //创建第二个字符串数组常量,作为邮件的主题 52         var subjects = [ 53             "You think water moves fast?", 54             "They called me Mr Glass", 55             "The path of the righteous man", 56             "Do you see any TeletubbIEs in here?", 57             "Now that we kNow who you are" 58         ] 59          60         //创建第三个字符串数组常量,作为邮件的信息 61         var messages = [ 62             "You should see ice. It moves like it has a mind. ", 63             "And I will strike down upon thee with great vengeance and furIoUs anger.", 64             "Look,just because I don‘t be givin‘ no man a foot massage don‘t make it right.", 65             "No? Well,that‘s what you see at a toy store.", 66             "In a comic,you kNow how you can tell who the arch-villain‘s going to be?" 67         ] 68          69         //通过一个循环,遍历信息数组 70         for i in 0 ..< messages.count 71         { 72             //创建一个邮件数据对象 73             let mail = MailData() 74             //从数组中加载相应的内容 75             mail.from = from[i] 76             //并依次设置邮件数据对象的各个属性 77             mail.subject = subjects[i] 78             mail.message = messages[i] 79             //设置邮件数据对象的时间属性 80             mail.date = String(format: "11:%d",arguments: [43 - i]) 81             //将邮件数据对象,添加到表格的数据源数组当中 82             demoData.append(mail) 83         } 84     } 85      86     //添加一个方法 87     //用来从数据源数组中,根据单元格的位置获得相应的数据 88     func mailForIndexPath(_ path: IndexPath) -> MailData 89     { 90         //根据单元格的行号,返回数据源数组中的数据 91         return demoData[(path as NSIndexPath).row] 92     } 93      94     //添加一个方法 95     //用来响应单元格中的删除按钮被点击时的事件 96     func deleteMail(_ path:IndexPath) 97     { 98         //从数据源数组中删除指定位置的数据 99         demoData.remove(at: (path as NSIndexPath).row)100         //从表格中删除指定的单元格101         tableVIEw.deleteRows(at: [path],with: .left)102     }103     104     //添加一个方法105     //当邮件的状态改变时调用此方法106     //例如邮件从未读转换为已读107     func updateCellindicator(_ mail: MailData,cell: MailtableCell)108     {109         //创建两个颜色变量,作为标识邮件状态的图标的颜色110         var color: UIcolor111         var innercolor : UIcolor?112         113         //根据邮件不同的状态,设置邮件不同的颜色114         if !mail.read && mail.flag115         {116             //当邮件未读并有标识时117             //设置标识图标的标识颜色118             color = UIcolor.init(red: 1.0,green: 149/255.0,blue: 0.05,Alpha: 1.0)119             //设置标识图标内部的颜色120             innercolor = UIcolor.init(red: 0.0,green: 122/255.0,blue: 1.0,Alpha: 1.0)121         }122         else if mail.flag123         {124             //当邮件具有标识时,125             //设置标识图标的标识颜色126             color = UIcolor.init(red: 1.0,Alpha: 1.0)127         }128         else if mail.read129         {130             //当邮件处于已读状态时,131             //设置标识图标的颜色为无色132             //即在视觉上隐藏该图标133             color = UIcolor.clear134         }135         else136         {137             //设置邮件在其他状态下的默认颜色138             color = UIcolor.init(red: 0.0,Alpha: 1.0)139         }140         141         //设置标识图标的颜色142         cell.indicatorVIEw.indicatorcolor = color143         //设置标识图标内部的颜色144         cell.indicatorVIEw.innercolor = innercolor145     }146     147     //添加一个方法,用来d出一个动作表单148     func showMailActions(_ mail: MailData,callback: @escaPing MailActionCallback)149     {150         //设置动作属性的值151         actionCallback = callback152         153         //初始化一个动作表单,依次设置相关参数154         let sheet = UIActionSheet.init(Title: "Actions",//标题155                                        delegate: self,//代理156                                        cancelbuttonTitle: "Cancel",//取消按钮的标题157                                        destructivebuttonTitle: "Trash")//销毁按钮的标题158         159         //往动作表单中依次添加三个按钮,160         //并设置三个按钮的标题文字161         sheet.addbutton(withTitle: "Mark as unread")162         sheet.addbutton(withTitle: "Mark as read")163         sheet.addbutton(withTitle: "Flag")164         165         //在根视图中显示动作表单166         sheet.show(in: self.vIEw)167     }168     169     //添加一个代理方法,用来监听动作表单中的选项被点击时的事件170     func actionSheet(_ actionSheet: UIActionSheet,clickedbuttonAt index: Int)171     {172         //获得当前类的属性的值173         if let action = actionCallback174         {175             //根据点击的不同选项,执行不同的 *** 作176             action(index == actionSheet.cancelbuttonIndex,177                    index == actionSheet.destructivebuttonIndex,178                    index)179             actionCallback = nil180         }181     }182     183     //添加一个方法,用来根据不同的标识状态,返回不同的文字内容184     func readbuttonText(_ read:Bool) -> String185     {186         return read ? "Mark as\nunread" : "Mark as\nread"187     }188     189     190     overrIDe func vIEwDIDLoad()191     {192         super.vIEwDIDLoad()193         194         //初始化一个矩形区域,作为表格的显示区域195         let frame = CGRect(x: 0,y: 20,wIDth: 320,height: 548)196         //创建一个指定显示区域的表格视图197         tableVIEw = UItableVIEw(frame: frame,style: UItableVIEwStyle.plain)198         199         //设置表格对象的数据源为当前的视图控制器对象200         tableVIEw.delegate = self201         //设置表格对象的代理为当前的视图控制器对象202         tableVIEw.dataSource = self203         //将表格视图添加到根视图中204         vIEw.addSubvIEw(tableVIEw)205         206         //调用方法,用来初始化表格的数据源207         prepareDemoData()208     }209     210     //添加一个代理方法,用来设置表格的行数211     func tableVIEw(_ tableVIEw: UItableVIEw,numberOfRowsInSection section: Int) -> Int212     {213         //在此设置表格的行数为数组的长度214         return demoData.count215     }216     217     //添加一个代理方法,用来初始化或复用表格中的单元格218     func tableVIEw(_ tableVIEw: UItableVIEw,cellForRowAt indexPath: IndexPath) -> UItableVIEwCell219     {220         //创建一个字符串常量,作为单元格的复用标识221         let IDentifIEr = "MailCell"222         //根据复用标识,从表格中获得可以复用的单元格223         var cell: MailtableCell! = tableVIEw.dequeueReusableCell(withIDentifIEr: IDentifIEr) as? MailtableCell224 225         //如果没有可以复用的单元格226         if cell == nil227         {228             //则初始化一个默认样式的单元格,并设置单元格的复用标识229             cell = MailtableCell(style: UItableVIEwCellStyle.default,reuseIDentifIEr: IDentifIEr)230         }231         //设置单元格的代理对象为当前的视图控制器对象232         cell.delegate = self233         234         //根据当前单元格的行号,获得数组中对应的邮件数据235         let data: MailData = demoData[(indexPath as NSIndexPath).row]236         //设置单元格的邮件来源标签的文字内容237         cell!.mailFrom.text = data.from238         //依次设置其他标签的相关内容239         cell!.mailSubject.text = data.subject240         cell!.mailMessage.text = data.message241         cell!.mailTime.text = data.date242         243         //调用方法,根据邮件的状态,刷新单元格的视觉效果244         updateCellindicator(data,cell: cell)245         246         //最后返回设置好的单元格对象247         return cell248     }249     250     //添加一个代理方法,用来设置单元格的高度为110251     func tableVIEw(_ tableVIEw: UItableVIEw,heightForRowAt indexPath: IndexPath) -> CGfloat252     {253         return 110254     }255     256     //添加一个代理方法,设置单元格允许滑动的手势257     func swipetableCell(_ cell: MGSwipetableCell,canSwipe direction: MGSwipeDirection) -> Bool258     {259         return true260     }261     262     //添加一个代理方法,设置当单元格上有滑动手势时,所显示的功能按钮,以及功能按钮显示的视觉效果263     func swipetableCell(_ cell: MGSwipetableCell,swipebuttonsFor direction: MGSwipeDirection,swipeSettings: MGSwipeSettings,expansionSettings: MGSwipeExpansionSettings) -> [UIVIEw]?264     {265         //设置功能按钮的显示方式为三维旋转效果。266         //共有:边缘、静态、拖动、中心裁切、三维旋转等五种效果267         swipeSettings.Transition = MGSwipeTransition.rotate3D268         //设置功能按钮的索引为0269         expansionSettings.buttonIndex = 0270         271         //获得在当前单元格中,需要显示的邮件内容272         let mail = mailForIndexPath(tableVIEw.indexPath(for: cell)!)273         274         //处理当手势为从左到右滑动时的情况275         if direction == MGSwipeDirection.leftToRight276         {277             //设置在该手势下,按钮将以d性的方式返回原来的位置278             expansionSettings.fillOnTrigger = false279             //设置触发显示功能按钮的阈值大小,默认值为1.5280             expansionSettings.threshold = 2281             //初始化一个颜色常量,作为功能按钮的背景颜色282             let color = UIcolor.init(red:0.0,green:122/255.0,blue:1.0,Alpha:1.0)283             284             //返回一个功能按钮,并设置按钮的标题、背景颜色和交互动作285             return [286                 MGSwipebutton(Title: readbuttonText(mail.read),//标题287                               backgroundcolor: color,//背景颜色288                               callback: { (cell) -> Bool in//交互动作289                               //当该按钮被点击时,将切换当前邮件的阅读状态290                               mail.read = !mail.read291                               //同时刷新当前邮件所在单元格的外观状态292                               self.updateCellindicator(mail,cell: cell as! MailtableCell)293                               //接着刷新单元格的内容视图294                               cell.refreshContentVIEw()295                               //根据邮件的阅读状态的变化,刷新被添加按钮的标题文字296                               (cell.leftbuttons[0] as! UIbutton).setTitle(self.readbuttonText(mail.read),for: UIControlState())297                     298                     //最后返回真,使功能按钮自动隐藏,结束按钮的点击事件299                     return true300                 })301             ]302         }303         else304         {305             //处理当手势为从右到左滑动时的情况306 307             //设置在该手势下,按钮将在触发时填充单元格308             expansionSettings.fillOnTrigger = true309             //设置触发显示功能按钮的阈值大小1.1,默认值为1.5310             expansionSettings.threshold = 1.1311             312             //设置按钮的内边距为15313             let padding = 15314             //初始化三个颜色常量,作为三个按钮的背景颜色315             let color1 = UIcolor.init(red:1.0,green:59/255.0,blue:50/255.0,Alpha:1.0)316             let color2 = UIcolor.init(red:1.0,green:149/255.0,blue:0.05,Alpha:1.0)317             let color3 = UIcolor.init(red:200/255.0,green:200/255.0,blue:205/255.0,Alpha:1.0)318             319             //添加第一个功能按钮,依次设置相关参数320             let trash = MGSwipebutton(Title: "Trash",//标题321                                       backgroundcolor: color1,//背景颜色322                                       padding: padding,//内间距323                                       callback: { (cell) -> Bool in//交互动作324                                       //当该按钮被点击时,325                                       //将从表格中移除按钮所在的单元格,326                                       //并在数组中移除该单元格的内容。327                                       self.deleteMail(self.tableVIEw.indexPath(for: cell)!)328                 return false329             })330             331             //添加第二个功能按钮,依次设置相关参数332             let flag = MGSwipebutton(Title: "Flag",//标题333                                      backgroundcolor: color2,//背景颜色334                                      padding: padding,//内间距335                                      callback: { (cell) -> Bool in//交互动作336                                      //获得在当前单元格中,需要显示的邮件内容337                                      let mail = self.mailForIndexPath(self.tableVIEw.indexPath(for: cell)!)338                                      //更改邮件的标识状态339                                      mail.flag = !mail.flag340                                      //刷新当前邮件所在单元格的外观状态341                                      self.updateCellindicator(mail,cell: cell as! MailtableCell)342                                      //刷新单元格的内容视图343                                      cell.refreshContentVIEw()344                 345                 return true346             })347             348             //添加第三个功能按钮,依次设置相关参数349             let more = MGSwipebutton(Title: "More",//标题350                                      backgroundcolor: color3,//背景颜色351                                      padding: padding,//内间距352                                      callback: { (cell) -> Bool in//交互动作353                                      //获得当前单元格在表格中的位置354                                      let path = self.tableVIEw.indexPath(for: cell)!355                                      //获得在当前单元格中,需要显示的邮件内容356                                      let mail = self.mailForIndexPath(path)357                 358                 //创建一个动作表单,拥有:取消、删除和索引三个选项359                 self.showMailActions(mail,callback: { (cancelled,deleted,index) in360                     //取消选项被点击时的情况361                     if cancelled362                     {363                         return364                     }365                     //删除选项被点击时的情况366                     else if deleted367                     {368                         //此时删除当前的单元格,以及数组中的数据369                         self.deleteMail(path)370                     }371                     //索引选项被点击时的情况,当索引值为1时372                     else if index == 1373                     {374                         //更改邮件的阅读状态375                         mail.read = !mail.read376                         //根据更改后的阅读状态,刷新当前单元格的标识图标377                         self.updateCellindicator(mail,cell: cell as! MailtableCell)378                         //同时刷新单元格的内容视图379                         cell.refreshContentVIEw()380                         //根据邮件的阅读状态的变化,刷新被添加按钮的标题文字381                         (cell.leftbuttons[0] as! UIbutton).setTitle(self.readbuttonText(mail.read),for: UIControlState())382                         //然后以动画的方式,隐藏功能按钮383                         cell.hIDeSwipe(animated: true)384                     }385                 })386                 //最后返回假,以保持功能按钮的显示状态387                 return false388             })389             //在方法的末尾,返回三个功能按钮390             return [trash,flag,more]391         }392     }393     394     overrIDe func dIDReceiveMemoryWarning() {395         super.dIDReceiveMemoryWarning()396         // dispose of any resources that can be recreated.397     }398 }
总结

以上是内存溢出为你收集整理的[Swift通天遁地]二、表格表单-(7)电子邮件Mail:实现单元格左右滑动调出功能按钮全部内容,希望文章能够帮你解决[Swift通天遁地]二、表格表单-(7)电子邮件Mail:实现单元格左右滑动调出功能按钮所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1021872.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存