iOS项目开发实战(Swift)—初探TableView

在本次学习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.运行结果:

iOS项目开发实战(Swift)—初探TableView_第1张图片iOS项目开发实战(Swift)—初探TableView_第2张图片iOS项目开发实战(Swift)—初探TableView_第3张图片iOS项目开发实战(Swift)—初探TableView_第4张图片


5.总结

      学习Swift一周了,基本是通过看视频,看相关的文档进行学习,不过目前的进度是任重而道远。此外还要抽空学学OC,毕竟OC现在仍然是iOS的主流。在学习过程中发现Swift2.0版的开源项目好少,并且Swift2.0与之前的版本语法差别也很大,只能通过看官方文档进行学习。目前的学习计划就是主要学Swift,同时补补OC的基础知识,加油~

你可能感兴趣的:(iOS项目开发实战(Swift)—初探TableView)