对于好书APP的总结

好久没写博客了主要在跟着strong的视频做好书这个app,好书这个APP感觉学到非常多吧 所以好好总结一下

设置文本textView的不可编辑性

self.bookTextView?.editable = false

用闭包回传值 

首先定义闭包

//实现回调 用闭包
typealias Push_TitleCallBack = (title:String) -> Void
定义回调

var callBack:Push_TitleCallBack?

传输要传送的值

  //实现回调
        self.callBack!(title: (self.textField?.text!)!)

实现回调 在OC中,为了避免内存泄露,可以将self 设置为 weak self

 vc.callBack =  {(title:String) -> Void in
            weak var wself = self
            wself.book_Title = title
            wself.tableView?.reloadData()
    }

内存泄露的问题,在项目中,在退出这个界面的时候,要检查这个页面是否有内存泄露的问题,因此,需要些这个函数,当内存释放时,便会调用这个函数

  //当内存完全释放的时候 会调用这个函数 否则内存就会泄露
    deinit{
        print("error")
        //当注册通知后 要把通知全部移除掉
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
在这个项目中,引发内存泄露的主要问题是这个协议没有释放,swift的协议是自动释放的,然而OC的有可能不会,因此只要在前面加上weak就行,还有就是swift中的协议必须是全部实现的,然而OC中的协议是有可选的,swift类型的协议前面也可以加weak,只需在协议定义的时候继承自class即可

protocol PhotoPickerDelegate:class{
    func getImageFromPicker(image:UIImage)
}
 weak var delegate:PhotoPickerDelegate!

@objc protocol BookTitleDelegate{
    optional func choiceCover()
}
 weak var delegate:BookTitleDelegate?

日期的写法 要注意日期的写法一定要一模一样,否则会出错

 //date的初始化格式
        let date = self.bookObject!["createAt"] as! NSDate
        //日期的编码格式
        let format = NSDateFormatter()
        //一定要这么写
        format.dateFormat = "yy-MM-dd hh:mm"
      self.bookTitleView?.date?.text = format.stringFromDate(date)
当有textView等要输入的东西时,立即弹出键盘

 self.input?.inputTextView?.becomeFirstResponder()

tableView的一些使用方法

tableView使用代码注册cell 不用再sb中用identifer进行标示

 self.tableView?.registerClass(discussTableViewCell.classForCoder(), forCellReuseIdentifier: "cell")
当tableView底部留有一些空白时,会有边角,因此,删去这些边角

  self.tableView?.tableFooterView = UIView()


现在的app中 都有加载tableView的时候的加载界面 所以在tableView中可以实现 下拉刷新的时候是在原来数组的基础上在增加多少个,并且跳过已经加载的,而上拉加载的话,是原来的20个 一开始就进行加载

self.tableView?.mj_header.beginRefreshing()

  //上拉加载 下拉刷新

        self.tableView?.mj_header = MJRefreshNormalHeader(refreshingTarget: self, refreshingAction: "headerReFresh")
        self.tableView?.mj_footer = MJRefreshBackFooter(refreshingTarget: self, refreshingAction: "footerReFresh")
在实现cell中 要注意cell一直是一个重用的过程,因此,首先需将cell中的subViews都去除

 for view in cell.contentView.subviews{
           view.removeFromSuperview()
        }
插入cell的动画方法

 //插入一行cell
        self.tableView?.beginUpdates()
    let tempIndex = [NSIndexPath(forRow: 2, inSection: 0)]
        if self.showStar{
            self.titleArray.removeAtIndex(2)
            self.tableView?.deleteRowsAtIndexPaths(tempIndex, withRowAnimation: .Right)
            self.showStar = false
        }else{
        self.titleArray.insert("", atIndex: 2)
        self.tableView?.insertRowsAtIndexPaths(tempIndex, withRowAnimation: .Left)
        self.showStar = true
        }
        self.tableView?.endUpdates()

大致就是这些

从xib加载文件 有些视图是纯代码添加的,直接初始化即可,然而,有些是xib写的,因此加载方法会有些不同

  self.input = NSBundle.mainBundle().loadNibNamed("InputView", owner: self, options: nil).last as? InputView

将某个界面插到另外一个界面下

 //将某个界面插入到另外一个界面下
           self.view.insertSubview(self.layView!, belowSubview: self.input!)
注册通知

 //注册通知
    
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "pushBookNotifocation:", name: "pushBookNotification", object: nil)
    }

当有人发送了名为pushBookNotification的通知后 就调用这个函数pushBookNotification:

func pushBookNotifocation(notification:NSNotification){
        let dict = notification.userInfo
        if String(dict!["success"]!) == "true"{
            if self.fixType == "fix" {
                ProgressHUD.showSuccess("修改成功")
            }else{
            ProgressHUD.showSuccess("上传成功")
            }
            self.dismissViewControllerAnimated(true, completion: nil)
        }else{
            ProgressHUD.showError("上传失败")
        }
    
    }
在析构函数中,必须移除掉所有的通知

 NSNotificationCenter.defaultCenter().removeObserver(self)
发送通知

NSNotificationCenter.defaultCenter().postNotificationName("pushBookNotification", object: nil, userInfo: ["success":"true"])

将自己的背景颜色变成灰白色

 self.modalPresentationStyle = .OverFullScreen
        
        self.view.backgroundColor = UIColor.clearColor()
将一个类中的方法命名为static时,就是静态方法,也就是只要类名称就可以调用这个方法

class pushBook:NSObject{
    static func pushBookInBackGround(dic:NSDictionary,object:AVObject){


加载自定义字体的方法,现将外面的字体导入 随后在plist文件中进行初始化


 
随后就可以加载该字体

self.Editor?.font = UIFont(name: MY_FONT, size: 15)

可以将代码中常用到的一些参数设置为常量,就是OC中的宏 自定义成一个文件 屏幕的宽高的话 一般都是设置为常量的,因为要适配不同的大小

let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width
let SCREEN_HEIGHT = UIScreen.mainScreen().bounds.size.height

let MAIN_RED = UIColor(colorLiteralRed: 235/255, green: 114/255, blue: 118/255, alpha: 1)

let MY_FONT = "Bauhaus ITC"
//设置颜色的方法
func setColor(r:CGFloat,g:CGFloat,b:CGFloat)-> UIColor{
  let temp:CGFloat = 255.0
 return UIColor(red: r / temp, green: g / temp, blue: b / temp, alpha: 1.0)
}

多线程的作用,在进行数据的一些复杂操作时,可以考虑,开一个队列,在其中进行复杂的操作,而UI得跟新是在主线程中的,注意不能进行阻塞 可以通过设置断点,在调试时查看线程 while true是一个死循环






所以可以异步传输 用GCD 还可以用thread 

 print(NSThread.currentThread())

当键盘出现时的整个界面向上移 因为加了自动布局,所以,可以把自动布局的扩充向上移 记住必须要有下面这句话

  self.topLayout.constant = -200
            //加载新的约束
            self.view.layoutIfNeeded()
navigation bar 推过来的时候自动添加了back 和蓝色的返回键 可以把返回键的颜色改掉,并且只要把back向上移,就可以把back去除

 self.navigationController?.navigationBar.tintColor = UIColor.grayColor()
        //把back这个词拿掉 可以向上移60 超出屏幕的范围即可
    UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics: .Default)

纯代码添加tabbarController 随后rabBarController中每个添加的为navigationController,在appDelegate中加载主界面

self.window = UIWindow(frame: CGRectMake(0,0,SCREEN_WIDTH,SCREEN_HEIGHT))
        
        let tabbatController = UITabBarController()
        
        let rankController = UINavigationController(rootViewController: rankViewController())
        let searchController = UINavigationController(rootViewController: searchViewController())
        let pushController = UINavigationController(rootViewController: pushViewController())
        let circleController = UINavigationController(rootViewController: circleViewController())
        let moreController = UINavigationController(rootViewController: moreViewController())
        
        tabbatController.viewControllers = [rankController,searchController,pushController,circleController,moreController]
        
        let tabitem1 = UITabBarItem(title: "排行榜", image: UIImage(named: "bio"), selectedImage: UIImage(named: "bio_red"))
        let tabitem2 = UITabBarItem(title: "发现", image: UIImage(named: "timer 2"), selectedImage: UIImage(named: "timer 2"))
        let tabitem3 = UITabBarItem(title: "", image: UIImage(named: "pencil"), selectedImage: UIImage(named: "pencil_red"))
        let tabitem4 = UITabBarItem(title: "圈子", image: UIImage(named: "users two-2"), selectedImage: UIImage(named: "users two-2_red"))
        let tabitem5 = UITabBarItem(title: "更多", image: UIImage(named: "more"), selectedImage: UIImage(named: "more_red"))
        
        rankController.tabBarItem = tabitem1
        searchController.tabBarItem = tabitem2
        pushController.tabBarItem = tabitem3
        circleController.tabBarItem = tabitem4
        moreController.tabBarItem = tabitem5
        
        
        rankController.tabBarController?.tabBar.tintColor = MAIN_RED
        
        self.window?.rootViewController = tabbatController
        self.window?.makeKeyAndVisible()
        

当键盘出现时 真个textView向上移,contentInset是有上下左右的平移,这里就是向上平移键盘的高度 当键盘消失时,就不用平移

//键盘遮挡
    func keyboardWillHideNotification(notifacition:NSNotification) {
        
    self.textView?.contentInset = UIEdgeInsetsMake(0, 0,0, 0)
    }
    func keyboardWillShowNotification(notifacition:NSNotification) {
           //返回键盘的大小
        let rect = XKeyBoard.returnKeyBoardWindow(notifacition)
        self.textView?.contentInset = UIEdgeInsetsMake(0, 0, rect.size.height, 0)
        
    }

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值