前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swift 书面 ToDo App

Swift 书面 ToDo App

作者头像
全栈程序员站长
发布2022-07-06 08:59:29
1.5K0
发布2022-07-06 08:59:29
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是全栈君。

下面的代码是使用的全部Xcode Version 6.0.1 (6A317)书面。

因为当使用团队开发stroyboard在并购的诸多不便的时间,所有或使用.xib该文件准备ToDo App.

想要实现的功能:TableView 够添加待做选项。并依照时间先后排序,能够实现删除。到点通知功能。

想要实现的效果例如以下:

Swift 书面 ToDo App
Swift 书面 ToDo App
Swift 书面 ToDo App
Swift 书面 ToDo App
Swift 书面 ToDo App
Swift 书面 ToDo App

步骤:

1、新建一个基于Singal View Application 的project,然后删掉storyboard,在新建两个新文件 Main.xib 和 Main.swift 作为基本的ViewController,打开 Main.xib 将 File’s Owner的l类属性改为 Main(这样才干够将关联变量拖动到 Mian.swift )。

Main.xib 页面UI。一个用于展示todo list 的 tableView,然后关联一个 tableView 变量到 Main.swift文件

Swift 书面 ToDo App
Swift 书面 ToDo App

2、接下来设置 Mian 为rootViewController,在AppDelegate.swift中做写例如以下代码:

代码语言:javascript
复制
 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
       
        var viewController = Main(nibName: "Main", bundle: nil)
        navigationController = UINavigationController(rootViewController: viewController)
        
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window?.rootViewController = navigationController
        self.window?.makeKeyAndVisible()
        
        return true
    }

注意: var viewController = Main(nibName: “Main”, bundle: nil) ,用来将 Mian.xib 与 Mian.swift 进行绑定。run 一下你就能够看到界面了。

3、然后在Main.swift 中编写一下TableView 的数据源和代理的方法。这里我们用的是 自己定义的 Cell。全部新建一个 Cell.xib 和 Cell.swift 并将它们关联起来,做法和上面的同样,Cell.xib UI 例如以下。

Swift 书面 ToDo App
Swift 书面 ToDo App
代码语言:javascript
复制
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 20
    }
    
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? Cell
        var str: String
        if (cell == nil) {
            let nibs:NSArray = NSBundle.mainBundle().loadNibNamed("Cell", owner: self, options: nil)
            cell = nibs.lastObject as? Cell
        }
        
        cell?.todoTitle.text = "toDoTitle"
        cell?.time.text = "\(NSDate())"
        cell?.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
        return cell!
    }
    
    
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    }
    
    
    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == UITableViewCellEditingStyle.Delete {
        
        }
    }

run 一下就能够看到例如以下效果:

Swift 书面 ToDo App
Swift 书面 ToDo App

注意:考虑到UITableView的滚动性能。Cell 的重用很重要,通过上面的 println(cell),滚动Cell,观察打印出来的 Cell 地址。能够看到 Cell 并没有进行重用。

override func viewDidLoad() { } 中加入以下的代码使 Cell 重用。

代码语言:javascript
复制
var bundle: NSBundle = NSBundle.mainBundle()        var nib: UINib = UINib(nibName: "Cell", bundle: bundle)        tableView.registerNib(nib, forCellReuseIdentifier: cellIdentifier)

4、以上讲到的都是些静态的数据,接下来我们做一些动态数据。

4.1、在NavigationBar 添加一个 ‘+’ button,用来给用户添加待做选项

代码语言:javascript
复制
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: "addItem")

响应函数:

代码语言:javascript
复制
func addItem() {
        let addVC: Add = Add(nibName: "Add", bundle: nil)
        addVC.delegate = self;
        self.presentViewController(addVC, animated: true, completion: nil)
    }

4.2、新增一个 Add.xib 和 Add.swift 让用户输入待做选项。记得绑定(同步骤1),Add.xib UI例如以下:

Swift 书面 ToDo App
Swift 书面 ToDo App

为了在Main.swift 中接收到 Add.xib 中用户输入的信息,我们在 Add.swift 定义一个协议。然后Main.swift 遵循这个协议,在Add.xib 界面消失前获取用户输入信息。

代码语言:javascript
复制
protocol AddProtocal {
    func didCompleted(addObject: Add)
}

Add.swift 代码例如以下:

代码语言:javascript
复制
//
//  Add.swift
//  ToDoApp
//
//  Created by aaron on 14-9-17.
//  Copyright (c) 2014年 The Technology Studio. All rights reserved.
//

import UIKit

protocol AddProtocal {
    func didCompleted(addObject: Add)
}


class Add: UIViewController {
    
    @IBOutlet var todo: UITextField!
    @IBOutlet var desc: KCTextView!
    @IBOutlet var time: UIDatePicker!
    @IBOutlet var completeBtn: UIButton!
    var delegate: AddProtocal?        required init(coder aDecoder: NSCoder) {        super.init(coder: aDecoder)    }        override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)    }            override func viewWillAppear(animated: Bool) {        setup()    }        func setup() {        completeBtn.layer.cornerRadius = 5.0        todo.placeholder = "请输入待做项"//        desc.placeholder = "请输入具体描写叙述。"        todo.text = self.todo.text        desc.text = self.desc.text        time.date = self.time.date        time.minimumDate = NSDate.date()                if delegate? == nil {            todo.textColor = UIColor.lightGrayColor()            todo.userInteractionEnabled = false            desc.textColor = UIColor.lightGrayColor()            desc.userInteractionEnabled = false            time.userInteractionEnabled = false            completeBtn.setTitle("好", forState: UIControlState.Normal)        }else {            todo.textColor = UIColor.blackColor()            todo.userInteractionEnabled = true            desc.textColor = UIColor.blackColor()            desc.userInteractionEnabled = true            time.userInteractionEnabled = true            completeBtn.setTitle("完毕", forState: UIControlState.Normal)        }                let swipeGesture = UISwipeGestureRecognizer(target: self, action:"hideKeyboard")        swipeGesture.direction = UISwipeGestureRecognizerDirection.Down        swipeGesture.numberOfTouchesRequired = 1        self.view.addGestureRecognizer(swipeGesture)                   }        func hideKeyboard() {        println("swipeGesture....")        todo.resignFirstResponder()        desc.resignFirstResponder()    }        func shakeAnimation(sender: AnyObject) {        let animation = CAKeyframeAnimation()        animation.keyPath = "position.x"        animation.values = [0, 10, -10, 10, 0]        animation.keyTimes = [0, 1/6.0, 3/6.0, 5/6.0, 1]        animation.duration = 0.4        animation.additive = true        sender.layer.addAnimation(animation, forKey: "shake")    }                @IBAction func completeTouch(sender: AnyObject) {        if (countElements(todo.text) > 0){            delegate?.didCompleted(self)            self.dismissViewControllerAnimated(true, completion: nil)        }else{            shakeAnimation(todo)        }    }    @IBAction func editingDidEnd(sender: UITextField) {        if (countElements(sender.text) == 0) {           shakeAnimation(todo)        }            }    }

ToDo项为空时会有一个小小的提示动画:

Swift 书面 ToDo App
Swift 书面 ToDo App

Add.swift 中的关联变量 desc 是UITextView 类型的,UITextView 不像 UITextField 有 placeHolder ,所以这里我们引入一个 OC 写的 KCTextView ,由 KCTextView 取代 UITextView,swift 中引用 OC 写的 API easy,新建一个 .h 。把你须要用到的头文件统统写在里面,然后 Build Settings 中的 Object-C Bridging Header 写入 .h 文件的路径就可以。接着就能够正常使用 OC 写的接口了。

Swift 书面 ToDo App
Swift 书面 ToDo App

Main.swift 实现 AddProtocal,并实现协议规定的函数:

代码语言:javascript
复制
func didCompleted(addObject: Add) {
  
        toDoData.append(addObject)
        tableView.reloadData()
}

toDoData的是一个 Add类型的可变数组。

Main.swift 代码例如以下:

代码语言:javascript
复制
//
//  Main.swift
//  ToDoApp
//
//  Created by aaron on 14-9-16.
//  Copyright (c) 2014年 The Technology Studio. All rights reserved.
//

import UIKit

class Main: UIViewController, UITableViewDataSource, UITableViewDelegate, AddProtocal {

    @IBOutlet var tableView: UITableView!
    let cellIdentifier = "Cell"

    var toDoData = [Add]()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setup()
        registerCell()
    }
    
    func setup() {
        self.title = "To Do List"
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: "addItem")

    }
    
    func registerCell() {
        var bundle: NSBundle = NSBundle.mainBundle()
        var nib: UINib = UINib(nibName: "Cell", bundle: bundle)
        tableView.registerNib(nib, forCellReuseIdentifier: cellIdentifier)
    }
    
    
    func addItem() {
        let addVC: Add = Add(nibName: "Add", bundle: nil)
        addVC.delegate = self;
        self.presentViewController(addVC, animated: true, completion: nil)
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return toDoData.count
    }
    
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? Cell
        var str: String
        if (cell == nil) {
            let nibs:NSArray = NSBundle.mainBundle().loadNibNamed("Cell", owner: self, options: nil)
            cell = nibs.lastObject as? Cell
        }
        
        let addObject = toDoData[indexPath.row] as Add
        cell?.todoTitle.text = addObject.todo.text        cell?.time.text = dateFormatter(addObject.time.date)        cell?.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator        return cell!    }            func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {        let addVC = toDoData[indexPath.row] as Add        addVC.delegate = nil        self.presentViewController(addVC, animated: true, completion: nil)    }            func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {        if editingStyle == UITableViewCellEditingStyle.Delete {            toDoData.removeAtIndex(indexPath.row)            tableView.reloadData()        }    }         func didCompleted(addObject: Add) {          toDoData.append(addObject)        toDoData.sort({ self.dateFormatter($0.time.date) < self.dateFormatter($1.time.date)})//按时间排序        tableView.reloadData()            }            func dateFormatter(date: NSDate) -> String {        let formatter = NSDateFormatter()        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"        formatter.locale = NSLocale(localeIdentifier: NSGregorianCalendar)        let dateStr = formatter.stringFromDate(date)        return dateStr    }    override func didReceiveMemoryWarning() {        super.didReceiveMemoryWarning()        // Dispose of any resources that can be recreated.    }}

最后你大概能够看到这种效果:

Swift 书面 ToDo App
Swift 书面 ToDo App

5、最后一步,为待做项目加入通知功能,这一功能在之前的文章(ios8 notifacation in swift)中就讲过了,这里就不反复写了。完整的项目代码我发在github上来。须要的到这里拿。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117472.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月5,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档