好久没写博客了主要在跟着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)
}
}