美文网首页swift 开发
swift开发:常用小功能

swift开发:常用小功能

作者: djyuning | 来源:发表于2016-05-13 10:35 被阅读42次
    常用小功能 - 图片(Retina Xcode Mini · [Jip](https://dribbble.com/Jip))
    日常开发中,有些代码会整理成小的代码片段(snippet),但保不齐什么时候就弄丢了,唐巧大神说可以备份在GIT(《使用 Git 来管理 Xcode 中的代码片段》)上,我觉得真的是不错的办法。当然,简书也是不错的方案(虽然不支持锚点),但能够图文并茂的实现保存代码片段,才是我的最终得目的。林林总总不断增加。

    索引

    • swift 项目添加OC库
    • 系统控件不显示本地语言
    • 视图跳转
    • 去掉导航栏返回按钮文字
    • 改变状态栏颜色
    • 在状态栏显示网络活动指示器
    • 启动屏幕(闪屏)显示时长
    • 标准时间转换为常规日期
    • NSDate的dateFromString总是返回nil值 - 中国夏令时问题
    • 自定义xib文件时出现警告信息【Frame for "某个对象" will be different at run time.】
    • UITextField 关闭首字母自动大写和拼写纠正
    • Directory not found for option “某个框架”
    • URL字符串编码和解码
    • 从文章正文提取第一张图片的src地址
    • 网络请求出现 App Transport Security has blocked a cleartext HTTP 错误

    swift 项目添加OC库

    除了使用CocoaPods工具添加第三方库,swift中还可以使用Objective-C Bridging Header配置来添加第三方库:
    首先:把需要导入的库文件拖动到项目的库目录(或根目录,根据项目工程开发规范而定);

    导入的库文件到项目的库目录
    然后:在项目根目录下(左侧文件列表中,以当前应用的蓝色图标为根目录,黄色文件夹不是哦)新建一个AppName-OC-Bridging-Header.h的文件,然后添加引用该库的头文件;
    #ifndef BookFeeds_OC_Bridging_Header_h
    #define BookFeeds_OC_Bridging_Header_h
    
    // GDataXML-HTML
    #include "GDataXMLNode.h"
    
    #endif /* BookFeeds_OC_Bridging_Header_h */
    
    新建一个**AppName-OC-Bridging-Header.h**的文件
    最后,点击当前项目配置,【TARGETS - Build Settings】,搜索【Bridging】,双击右侧区域,在弹出的浮动输入框中输入AppName-OC-Bridging-Header.h这个文件名;
    配置Objective-C Bridging Header
    然后就可以在项目中引用并使用了。

    系统控件不显示本地语言

    打开“info.plist”,添加一项“Localized resources can be mixed”,值设置为“yes”即可!


    添加Localized resources can be mixed

    视图跳转

    页面A(HomeViewController.swift)进入页面B(InfoViewController.swift)

    // 页面B入栈
    let PageViewInfo = InfoViewController()
    self.navigationController?.pushViewController(PageViewInfo, animated: true)
    

    页面B返回页面A:

    self.navigationController?.popViewControllerAnimated(true)
    

    页面B进入页面C(DetialViewController.swift):

    let PageViewDetial = Menu()
    self.navigationController?.presentViewController(PageViewDetial, animated: true, completion: nil)
    

    页面C返回页面B:

    self.dismissViewControllerAnimated(true, completion: nil)
    

    页面B进入页面D(CommentViewController.swift):

    let PageViewComment = Menu()
    self.navigationController?.pushViewController(PageViewComment, animated: true)
    

    页面D回到页面A(回到根视图):

    self.navigationController?.popToRootViewControllerAnimated(true)
    

    去掉导航栏返回按钮文字

    self.navigationController?.navigationBar.topItem?.title = ""
    

    改变状态栏颜色

    状态栏颜色的变化可以体现出一个App的设计(和开发)用心程度,是用户体验的一个参考。改变状态栏颜色的方法:
    第一步:在Info.plist中设置UIViewControllerBasedStatusBarAppearance 为NO


    设置 UIViewControllerBasedStatusBarAppearance 为 NO

    第二步:在viewDidLoad中加一句

    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent;
    

    状态栏颜色只有两种 DefaultLightContent

    在状态栏显示网络活动指示器

    // 网络活动指示器 swift 3.0
    func networkActivityToggle(_ isVisible: Bool! = false) {
        DispatchQueue.main.async {
            UIApplication.shared.isNetworkActivityIndicatorVisible = isVisible
        }
    }
    

    启动屏幕(闪屏)显示时长

    IOS中貌似没有设置该项的属性,通常的做法是使用时间延迟,AppDelegate文件中设置 didFinishLaunchingWithOptions 代码如下:

    Thread.sleep(forTimeInterval: TimeInterval(2))
    

    标准时间转换为常规日期

    标准时间类似:Thu, 05 May 2016 07:33:34 +0000
    常规时间类似:2016-05-07 21:32:25

    func datetimeParse(datetime: String) -> String {
        if datetime.isEmpty {
          return ""
        }
        
        // 创建时间格式对象
        var stringTemp = datetime
        let standardFormatter = NSDateFormatter()
        standardFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
        standardFormatter.dateFormat = "EEE, d MMM yyyy HH:mm:ss Z"
        let appFormatter = NSDateFormatter()
        appFormatter.dateFormat = "yy-MM-dd HH:mm:ss"
        
        // String -> NSDate -> String
        stringTemp = appFormatter.stringFromDate((standardFormatter.dateFromString(datetime))!)
        
        return stringTemp
      }
    

    NSDate的dateFromString总是返回nil值 - 中国夏令时问题

    在英文系统语言下正常,在中文下总是返回nil,解决办法是添加格式化对象.locale = NSLocale(localeIdentifier: "en_US_POSIX")代码,请参考本文中相关的的代码。

    自定义xib文件时出现警告信息【Frame for "某个对象" will be different at run time.】

    如果定义的约束显示为蓝色,通常是没有问题的,但如果是红色就需要注意了。修复这些警告,可以选择更新约束。


    更新约束

    UITextField 关闭首字母自动大写和拼写纠正

    feedInput.autocapitalizationType = .None
    feedInput.autocorrectionType = .No
    

    Directory not found for option “某个框架”

    在项目的【Building Settings】【Framework Search Path】中清除相关的错误链接即可.,两个都要清除:


    Framework Search Path

    URL字符串编码和解码

    如果在和服务器的数据传输中需要用到域名信息,我们需要把域名中的特殊字符进行转义后才可以在服务器端正确接收和使用。

    // 编码
    let urlString: String = "http://feed.iplaysoft.com/"
    let a = urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet())
    print(a)
    
    // 解码
    let b = a?.stringByRemovingPercentEncoding
    print(b)
    

    输出:

    http%3A%2F%2Ffeed%2Eiplaysoft%2Ecom%2F
    http://feed.iplaysoft.com/
    

    服务器端通常有适合的URL解码方法,如PHP的urldecode方法。

    从文章正文提取第一张图片的src地址。

    // 从文章正文提取第一张图片的src地址
    func getThumb(content: String) -> String {
      var thumbURLString: String = ""
      
      // 创建正则
      let thumbPattern = try! NSRegularExpression(pattern: "[^\\'|\\"]+(?:jpg|png)", options: .CaseInsensitive)
      let thumbRanges = thumbPattern.matchesInString(content, options: .ReportProgress, range: NSRange(location: 0, length: content.characters.count) )
      
      if !thumbRanges.isEmpty {
        thumbURLString = NSString(string: content).substringWithRange(thumbRanges[0].range)
      }
      
      return thumbURLString
    }
    

    网络请求出现 App Transport Security has blocked a cleartext HTTP 错误

    新特性要求App内访问网络请求,要采用 HTTPS 协议。解决办法:

    • 在Info.plist中添加 NSAppTransportSecurity 类型 Dictionary ;
    • 在 NSAppTransportSecurity 下添加 NSAllowsArbitraryLoads 类型Boolean ,值设为 YES;
    NSAppTransportSecurity

    相关文章

      网友评论

        本文标题:swift开发:常用小功能

        本文链接:https://www.haomeiwen.com/subject/dzrlrttx.html