Swift3.0 功能一(持续更新)

相关知识点:

修改项目名称两种方式

  • 1.Bundle name
  • 2.Bundle display name
    这里写图片描述

try 三种处理异常的方式

  • 在swift中提供三种处理异常的方式
  // 方式一:try方式 程序员手动捕捉异常
    do {
            try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)
        } catch {
            // error异常的对象
            print(error)
        }

  // 方式二:try?方式(常用方式) 系统帮助我们处理异常,如果该方法出现了异常,则该方法返回nil.如果没有异常,则返回对应的对象
    guard let anyObject = try? NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) else {
        return
    }

  // 方式三:try!方法(不建议,非常危险) 直接告诉系统,该方法没有异常.注意:如果该方法出现了异常,那么程序会报错(崩溃)
     let anyObject = try!NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)

封装TabBar创建自控制器

//调用封装方法
    addChildViewController(LXRHomeViewController(), title: "首页", imageName: "tabbar_home")
    addChildViewController(LXRMessageViewController(), title: "消息", imageName: "tabbar_message_center")
    addChildViewController(LXRDiscoverViewController(), title: "发现", imageName: "tabbar_discover")
    addChildViewController(LXRProfileViewController(), title: "我", imageName: "tabbar_profile")  

// Swift支持方法的重改:方法名称相同.但是参数类型和个数不同
// private在当前文件中可以访问,其他文件不能访问
    private func addChildViewController(_ childVc: UIViewController, title : String, imageName : String) {
        //1.设置自控制器的属性
        childVc.title = title
        childVc.tabBarItem.image = UIImage(named: imageName)
        childVc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted")
        //2.包装导航控制器
        let childNav = UINavigationController(rootViewController: childVc)
        //3.添加控制器
        addChildViewController(childNav)
    }

根据Json文件,通过字符串获取数据

//1.获取JSON文件路径
guard let jsonPath = Bundle.main.path(forResource: "MainVCSettings.json", ofType: nil) else {
    LXRLog(message: "没有获取到对应的文件路径")
    return
}
//2.读取json文件中的内容
guard let jsonData = try? Data(contentsOf: URL(fileURLWithPath: jsonPath)) else {
    LXRLog(message: "没有获取到json文件中数据")
    return
}
//3.将Data转成数组
guard  let anyObject = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) else {
    return
}

guard let dictArray = anyObject as? [[String : AnyObject]] else{
    return
}
//4.遍历字典,获取对应的信息
for dict in dictArray{
    //4.1获取控制器的对应的字符创
    guard let VcName = dict["vcName"] as? String else {
        continue
    }
    //4.2获取控制器显示的title
    guard let title = dict["title"] as? String else {
        continue
    }
    //4.3获取控制器显示的图标名称
    guard let imageName = dict["imageName"] as? String else {
        continue
    }           
    //4.4添加自控制器
    addChildViewController(VcName, title: title, imageName: imageName)
}
// Swift支持方法的重改:方法名称相同.但是参数类型和个数不同
// private在当前文件中可以访问,其他文件不能访问

private func addChildViewController(_ childVcName: String, title : String, imageName : String) {

     //0.获得命名空间
    guard let nameSpace = (Bundle.main.infoDictionary!["CFBundleExecutable"] as? String)  else {
        LXRLog(message: "没有获取命名空间")
        return
    } 
    //1.根据字符创获取对应的Class
    guard let ChildVcClass = NSClassFromString(nameSpace + "." + childVcName)  else {
        LXRLog(message: "没有获取到字符创对应的Class")
        return
    }    
    // 2.将对应的AnyObject转成控制器的类型
    guard let childVcType = ChildVcClass as? UIViewController.Type else {
        LXRLog(message: "没有获取对应控制器的类型")
        return
    }       
    // 3.创建对应的控制器对象
    let childVc = childVcType.init()

   //4.设置自控制器的属性
    childVc.title = title
    childVc.tabBarItem.image = UIImage(named: imageName)
    childVc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted")
    //5.包装导航控制器
    let childNav = UINavigationController(rootViewController: childVc)
    //6.添加控制器
    addChildViewController(childNav)
}

代码创建Window

//1.创建Window  UIScreen.main.bounds屏幕尺寸
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = LXRMainTabBarController()
window?.makeKeyAndVisible()      

便利(convenience)构造函数

  • 便利构造函数通常用在对系统的类进行构造函数的扩充时使用
  • 便利(convenience)构造函数的特点:
1.便利构造函数通常都是写在 extension 里面
2.便利搞糟函数init前面加上 convenience
3.在便利搞糟函数中需要调用self.init()

这里写图片描述


Selector参数两种写法:

  • 1.Selector(“方法名”)
  • 2.”方法名”
  • 3.swift3.0版本#selector(类名.方法名)
    • 事件监听本质:
      • 1.将方法包装成@SEL->类中查找方法列表->根据@SEL找到imp指针(函数指针)->执行函数
      • 2.注意:swift中将一个函数声明成fileprivate,那么该函数不会被添加到方法列表中
      • 3.如果在fileprivate前面加上@objc,那么该方法仍然会被添加到方法列表中

这里写图片描述


Swift限定作用域访问级别

  • swift 3.0 之前,swift 提供3种不同的访问级别

    • public(公开)
    • internal(内部)–>系统默认
    • private(私用)
  • swift 3.0 private 将会被重新命名为 fileprivate

    • public(公开)
    • internal(内部)–>系统默认
    • private(私用)
    • fileprivate(文件内私有)

设置图片拉伸

这里写图片描述

弹簧动画效果

/**
 *  Duration:   持续时间
 *  delay:      延迟
 *  Damping:    阻力系数(0~1),越大效果越不明显
 *  Velocity:   速度
 *  options:    速度枚举
 *  animations: 动画
 *  completion: 完成
 */
 UIView.animate(withDuration: TimeInterval, delay: TimeInterval, usingSpringWithDamping: CGFloat, initialSpringVelocity: CGFloat, options: UIViewAnimationOptions, animations: () -> Void, completion: ((Bool) -> Void)?((Bool) -> Void)?(Bool) -> Void)

Swift中??的作用

  • 1.如果??前面的可选类型有值,那么将前面的可选类型进行解包并且赋值.
  • 2.如果??前面的可选类型为nil,那么直接使用??后面的值.
let iconViewUrl = LXRAccountTool.shareInstance.account?.avatar_large ?? ""

Swift中self使用场景

  • 注意: 两个地方需要使用self
    • 如果在一个函数中出现歧义
    • 闭包中使用当前对象的属性和方法也需要使用self

动态设置tableViewCell高

  • 必须实现的两个设置!!!
///设置行高
//自动尺寸
self.tableView.rowHeight = UITableViewAutomaticDimension 
//估算高度
self.tableView.estimatedRowHeight = 200 

storyBoard快捷键

  • 约束控件更新布局->快捷键

    • Command -> Option(Alt) -> =
  • 图片真实大小显示->快捷键

    • Command -> =

获取控件最大X.Y值

// 获取maxX->控件+frame+maxX
picCollectionView.frame.maxX
// 获取maxY->控件+frame+maxY
picCollectionView.frame.maxY

监听键盘通知

  • 添加通知
    这里写图片描述

  • 键盘通知实现方法
    这里写图片描述

  • 打印信息
    这里写图片描述


swift3.0调用相册和相机

  • 注意
    • Swift3.0中调用相机和相册会导致崩溃
    • 需要在Info.plist文件中加入两个键值对,如下:
    /// 都是String类型,内容任意的字符串即可
    Privacy - Photo Library Usage Description
    Privacy - Camera Usage Description 
  • UIImagePickerControllerSourceType枚举
public enum UIImagePickerControllerSourceType : Int {
    case photoLibrary           //相册
    case camera                 //相机
    case savedPhotosAlbum       //保存照片专辑
}
  • 示例Demo
//FIXME: 点击添加图片
@objc fileprivate func AddPhotoClick(){
    //1.判断照片控制器是否可用 ,不可用返回
    if !UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
        return
    }
    //2.创建照片控制器
    let picVc = UIImagePickerController()
    //3.设置控制器类型
    picVc.sourceType = .photoLibrary
    //4.设置是否可以管理已经存在的图片或者视频
    picVc.allowsEditing = true
    //5.设置代理
    picVc.delegate = self
    //6.弹出控制器
    present(picVc, animated: true, completion: nil)
}
  • UIImagePickerController协议

    • 需要遵循2个协议:
        UIImagePickerControllerDelegate,
        UINavigationControllerDelegate
    • 常用实现方法
    ///info: 返回的数据
    func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [String : Any])
  • 打印信息
    这里写图片描述


storyBoard快速包装导航或标签控制器

这里写图片描述


  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值