在本次学习TabView过程中,用到了以下基础知识,TabView的优化技术后续再学习。
1.UIAlertController
1)ActionSheet直接从底部弹出提示框
2)Alert直接从中间弹出提示框
3)通过UIAlertAction添加相应的属性(eg:Cancle/OK etc). UIAlertAction中的handler可以通过闭包来实现,闭包里面的action是UIAlertAction
2.UITableView
1)首先要实现UITableViewDataSource和UITableViewDelegate协议;
UITableViewDataSource中三个函数 func numberOfSectionsInTableView(tableView: UITableView) -> Int{ } 通过该函数指定TableView有多少块,默认为1 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ } 通过该函数指定每一块中有多少行 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath){ } UITableViewDelegate中一个函数 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ } 当选中某一行然后执行的操作 其它相关函数如下(代码注释) func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? { } 当编辑某一行时,添加相应的Action,如Delete/Share,返回的是一个UITableViewRowAction的数组。在其中某个action中实现handler的时候,若用闭包的时候,有两个参数,action是UITableViewRowAction类型的,还有一个是indexPath: NSIndexPath。
3.代码如下:
ViewController.swift
import UIKit class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { var baby = ["宝宝0","宝宝1","宝宝2","宝宝3","宝宝4","宝宝5","宝宝6","宝宝7","宝宝8","宝宝9","宝宝10","宝宝11"] var babyImage = ["宝宝0.jpg","宝宝1.jpg","宝宝2.jpg","宝宝3.jpg","宝宝4.jpg","宝宝5.jpg","宝宝6.jpg","宝宝7.jpg","宝宝8.jpg","宝宝9.jpg","宝宝10.jpg","宝宝11.jpg"] var tableView = UITableView() //标记图片是否已经被选中 var isFlag = [Bool](count : 12, repeatedValue: false) override func viewDidLoad() { super.viewDidLoad() //之前这个地方定义的是var tableView局部变量,导致点了delete没反应 tableView = UITableView(frame: CGRectMake(0, 0, 320, 600), style: UITableViewStyle.Plain) tableView.dataSource = self tableView.delegate = self self.view.addSubview(tableView) } func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } //每一块有多少行 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return baby.count } //绘制cell func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let initIdentifier = "Cell" let cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: initIdentifier) //下面两个属性对应subtitle cell.textLabel?.text = baby[indexPath.row] cell.detailTextLabel?.text = "baby\(indexPath.row)" //添加照片 cell.imageView?.image = UIImage(named: babyImage[indexPath.row]) cell.imageView!.layer.cornerRadius = 40 cell.imageView!.layer.masksToBounds = true //添加附件 cell.accessoryType = UITableViewCellAccessoryType.DetailButton if isFlag[indexPath.row] { cell.accessoryType = UITableViewCellAccessoryType.Checkmark }else{ cell.accessoryType = UITableViewCellAccessoryType.None } return cell } func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { //使用闭包,和嵌套函数或者JAVA中的匿名类类似 let locationActionHandler = {(action: UIAlertAction!) -> Void in let locationAlertController = UIAlertController(title: nil, message: "我是宝宝\(indexPath.row)", preferredStyle: UIAlertControllerStyle.Alert) let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil) locationAlertController.addAction(okAction) self.presentViewController(locationAlertController, animated: true, completion: nil) } let alertController = UIAlertController(title: "Baby\(indexPath.row)", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet) let cancleAction = UIAlertAction(title: "Cancle", style: UIAlertActionStyle.Cancel, handler: nil) alertController.addAction(cancleAction) let locationAction = UIAlertAction(title: "宝宝是几号", style: UIAlertActionStyle.Default, handler: locationActionHandler) alertController.addAction(locationAction) let markAction = UIAlertAction(title: "标记宝宝我一下", style: UIAlertActionStyle.Default, handler: {(action: UIAlertAction) -> Void in let cell = tableView.cellForRowAtIndexPath(indexPath) //此时可以将图片标记为勾,但是当往下拖动图片之前被标记的勾消失,是因为每次只加载出现在屏幕上的,其它都放在缓存池 cell?.accessoryType = UITableViewCellAccessoryType.Checkmark self.isFlag[indexPath.row] = true//然后每次加载时候在cellForRowAtIndexPath方法进行判断 }) alertController.addAction(markAction) presentViewController(alertController, animated: true, completion: nil) } //和下一个方法中实现deleteAction效果是一样的 // func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { // if editingStyle == UITableViewCellEditingStyle.Delete{ // self.baby.removeAtIndex(indexPath.row) // self.babyImage.removeAtIndex(indexPath.row) // self.isFlag.removeAtIndex(indexPath.row) // self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Middle) // } // } //分享和删除功能的实现 func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? { let shareAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Share", handler: { (action: UITableViewRowAction,indexPath: NSIndexPath) -> Void in let menu = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet) let cancelAction = UIAlertAction(title: "Cancle", style: UIAlertActionStyle.Cancel, handler: nil) let facebookAction = UIAlertAction(title: "facebook", style: UIAlertActionStyle.Default, handler: nil) let twitterAction = UIAlertAction(title: "twitter", style: UIAlertActionStyle.Default, handler: nil) menu.addAction(facebookAction) menu.addAction(twitterAction) menu.addAction(cancelAction) self.presentViewController(menu, animated: true, completion: nil) }) let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete", handler: { (action: UITableViewRowAction,indexPath: NSIndexPath) -> Void in self.baby.removeAtIndex(indexPath.row) self.babyImage.removeAtIndex(indexPath.row) self.isFlag.removeAtIndex(indexPath.row) self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Left) }) return [shareAction,deleteAction] } //每个cell的高度 func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return 80 } //隐藏bar override func prefersStatusBarHidden() -> Bool { return true } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
4.运行结果:
5.总结
学习Swift一周了,基本是通过看视频,看相关的文档进行学习,不过目前的进度是任重而道远。此外还要抽空学学OC,毕竟OC现在仍然是iOS的主流。在学习过程中发现Swift2.0版的开源项目好少,并且Swift2.0与之前的版本语法差别也很大,只能通过看官方文档进行学习。目前的学习计划就是主要学Swift,同时补补OC的基础知识,加油~