• iOS 弹出更新提示、评价app提示swift版) 提示更新,评价app 。

    检查App Store版本,提示更新

     //MARK: - 检查更新
        fileprivate func checkUpdate() {
            let path = NSString(format: "http://itunes.apple.com/cn/lookup?id=你的AppId") as String
            let url = URL(string: path)
            let request = NSMutableURLRequest(url: url!, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 10.0)
            request.httpMethod = "POST"
            NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: OperationQueue()) { (response, data, error) in
    
                let receiveStatusDic = NSMutableDictionary()
                if data != nil {
                    do {
                        let dic:NSDictionary = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
                        if let resultCount = dic["resultCount"] as? NSNumber {
                            print("???:\(response) &&版本信息: \(dic)")
                            if resultCount.intValue > 0 {
                                receiveStatusDic.setValue("1", forKey: "status")
                                if let arr = dic["results"] as? NSArray {
                                    if let dict = arr.firstObject as? NSDictionary {
                                        if let version = dict["version"] as? String {
                                            receiveStatusDic.setValue(version, forKey: "version")
                                            UserDefaults.standard.set(version, forKey: "Version")
                                            UserDefaults.standard.synchronize()
                                        }
                                        //更新内容
                                        if let releaseNotes = dict["releaseNotes"] as? String {
                                            UserDefaults.standard.set(releaseNotes, forKey: "releaseNotes")
                                            UserDefaults.standard.synchronize()
                                        }
                                    }
    
                                }
                            }
                        }
                    }catch let error {
                        log.debug("checkUpdate -------- \(error)")
                        receiveStatusDic.setValue("0", forKey: "status")
                    }
                }else {
                    receiveStatusDic.setValue("0", forKey: "status")
                }
                self.performSelector(onMainThread: #selector(SplashViewController.checkUpdateWithData(_:)), with: receiveStatusDic, waitUntilDone: false)
            }
        }
    
        @objc fileprivate func checkUpdateWithData(_ data: NSDictionary) {
            let status = data["status"] as? String
            if status == "1" {
    
                if let storeVersion = UserDefaults.standard.object(forKey: "Version") as? String {
                    if let releaseNotes = UserDefaults.standard.object(forKey: "releaseNotes") as? String {
                        self.compareVersion(LOCAL_VERSION, storeVersion: storeVersion,note:releaseNotes)
                        return
                    }
                }
            }
        }
    
        fileprivate func compareVersion(_ localVersion: String, storeVersion: String,note:String) {
            let message = "本次更新内容:\n\(note)"
            if localVersion.compare(storeVersion) == ComparisonResult.orderedAscending {
                let alertView = UIAlertView(title: "发现新版本",message: message,delegate: self,cancelButtonTitle: nil,otherButtonTitles: "马上更新","下次再说")
                alertView.delegate = self
                alertView.tag = 10086
                alertView.show()
            }
        }
    
        override func alertView(_ alertView:UIAlertView, clickedButtonAt buttonIndex: Int){
            if(alertView.tag == 10086) {
                if(buttonIndex == 0){
                    UIApplication.shared.openURL(URL(string:"itms-apps://itunes.apple.com/cn/app/xing-rui-yu-le/id你的AppId?mt=8")!)
                }else{
                    //下次再说
                }
            }
        }

    效果




    获取本地版本
    let LOCAL_VERSION:String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String


    弹出评价app的的提示

    1.判断是否是新安装或刚升级应用(也可用于设置引导页时的判断)

        //MARK: 判断是否是新安装或刚升级应用
        func isNewVersion() -> Bool{
            
            if(OLD_VERSION != nil){
                let oldVersion = OLD_VERSION as! String
                if(LOCAL_VERSION != oldVersion){//刚更新
                    NSUserDefaults.standardUserDefaults().setObject(LOCAL_VERSION, forKey:"oldVersion")
                    NSUserDefaults.standardUserDefaults().synchronize()
                    return true
                }
            }else{//新安装
                NSUserDefaults.standardUserDefaults().setObject(LOCAL_VERSION, forKey:"oldVersion")
                NSUserDefaults.standardUserDefaults().synchronize()
                return true
            }
            return false
        }

    其中
    let OLD_VERSION = NSUserDefaults.standardUserDefaults().valueForKey("oldVersion")

    2.下面的代码可以放在弹出提示的视图控制器或父类里
    //评价App
        func judgeApp(){
            let alert = UIAlertView(title: "评价XX",message: "预祝您观演愉快,您的评价可以帮我们做得更好哦!",delegate: self,cancelButtonTitle: "满足下你",otherButtonTitles: "别再烦我","下次再说")
            alert.cancelButtonIndex = 0
            alert.delegate = self
            alert.show()
            
        }
        
        func alertView(alertView:UIAlertView, clickedButtonAtIndex buttonIndex: Int){
            if(buttonIndex == 0) {//去评价
                UIApplication.sharedApplication().openURL(NSURL(string:"itms-apps://itunes.apple.com/cn/app/xing-rui-yu-le/id你的APPId?mt=8")!)
            }
            if(buttonIndex == 1) {//不再提示
                NSUserDefaults.standardUserDefaults().setObject(true, forKey:"NeverShow")
                NSUserDefaults.standardUserDefaults().synchronize()
            }
            if(buttonIndex == 2) {
                //do nothing
            }
            
        }

    3.调用的地方(放在你需要的地方弹出)
    if let willJudge = NSUserDefaults.standardUserDefaults().valueForKey("NeverShow"){
                    if(willJudge as! Bool == true){//不再提示为 true ,但是新版本,弹出提示且关闭不再提示
                        let delegate:AppDelegate = SHARE_APPLICATION.delegate as! AppDelegate
                        if(delegate.isNewVersion() == true){//刚更新过
                            judgeApp()
                            NSUserDefaults.standardUserDefaults().setObject(false, forKey:"NeverShow")
                            NSUserDefaults.standardUserDefaults().synchronize()
                        }else{//不再提示值为 true ,且不是新版本,不弹出提示
                            //不弹出
                        }
                    }else{//不再提示值为 false ,弹出提示
                        judgeApp()
                    }
                }else{ //不再提示值为 nil ,弹出提示
                    judgeApp()
                }



    展开全文
  • uni-app原生插件:富文本提示框
  • iOS app版本更新CheckVersion_Swift 前言 CheckVersion_Swift是一款轻量级的Swift版本的框架,框架功能:根据Apple提供的API去请求JSON,根据JSON中的版本号决定是否去更新原生App更新提示的内容可以自定义,也...

    iOS app版本更新CheckVersion_Swift

    前言

    CheckVersion_Swift 是一款轻量级的 Swift 版本的框架,框架功能:根据 Apple 提供的 API 去请求 JSON ,根据 JSON 中的版本号决定是否去更新原生 App。更新提示的内容可以自定义,也可以是 JSON 中给的内容。

    写作 CheckVersion_Swift 框架初衷

    通常在做 App 版本检查更新功能的时候,都是后台服务器为我们提供一个获取 App 最新版本信息的接口,并且在每次新版本更新后,都需要人工在后台更改版本信息,这样做其实也可以的,但是费事且不及时。

    其实苹果提供了一个很友好的 iTunes 接口,供我们获取 App Store 中 App 当前的最新信息。

    Example

    To run the example project, clone the repo, and run pod install from the Example directory first.

    Installation

    CheckVersion_Swift is available through CocoaPods. To install
    it, simply add the following line to your Podfile:

    pod 'CheckVersion_Swift'

    Use 

    /// check version
    ///
    /// - Parameters:
    /// - appId: app id,eg: 414478124 of the wechat
    /// - customContent: custom content,if the string is nil and the count of the string is greater 
    /// than zero,use custom content;Otherwise,use the content of the request data

    public class func checkVersion(_ appId: String, _ customContent: String?)

     
     

    // 直接显示接口中的更新内容
    CheckVersion.checkVersion(kAppId, nil)

     

    // 显示自定义的更新内容
    CheckVersion.checkVersion(kAppId, "自定义的更新内容...")

    License

    CheckVersion_Swift is available under the MIT license. See the LICENSE file for more info.

    原文地址https://www.cnblogs.com/MrXie821385843/p/10476199.html

    展开全文
  • 本篇文章包含了开发一个App及发布的大部分内容,有了本篇文章,大家再也不用东奔西跑的去找资料了,这里面有开发App的完整资料及如何建立一个属于自己的框架,这篇文章主要针对初学者,如果有写的不好的地方,大家...

    转载声明:http://www.jianshu.com/p/46bc8cf37cae


    本篇文章包含了开发一个App及发布的大部分内容,有了本篇文章,大家再也不用东奔西跑的去找资料了,这里面有开发App的完整资料及如何建立一个属于自己的框架,这篇文章主要针对初学者,如果有写的不好的地方,大家可以指出,希望和大家共同进步。 

    先谈下我对App的理解,无非就是发出数据请求,获取后台传来的数据,然后体现在界面上。这样也就是说我们我发送网络的get或者是post请求,然后就是获取到了数据,一般获取到的数据有三种形式:1.json格式(其实在我眼里就只有这一种) 2.xml格式 3.字符串形式。获得数据之后就是解析数据了,swift对于解析json数据也是非常简单的,对于解析出来的数据,一般有两种处理方式:1.使用本地数据持久化方式(通俗讲也就是将数据存起来,存到手机上)。2.直接将数据显示到界面上(不推荐,简单的也可以这么做啦)。在我眼里,说白了,开发一个App其实就是在做上面重复的事情。下面就来详细的讲下如何来搭建属于自己的框架。本篇是基于Xcode6.2,其实思路一样

    对于初学者来说,一般的网络请求,json数据简析这些使用开源框架就可以了

    第一步.网络请求框架 这里使用的是YYHRequest-Swift这个开源框架。下载地址:https://github.com/yayuhh/YYHRequest-Swift大家可以自行去下载。有了框架,申请数据就方便多了。简单的get,post方式申请数据:

    1.get方式(data是数据,对其处理就好了)


    let request = YYHRequest(url: NSURL(string: "http://www.google.com/"))

    request.loadWithCompletion {response, data, error in

    if let actualError = error {

    // handle error

    } else if let actualResponse = response {

    // handle success

    }

    }


    2.post方式:


    let request = YYHRequest(url: NSURL(string: "http://www.google.com/"))

    request.method = "POST"

    request.parameters["foo"] = "bar"

    request.completionHandler = { response, data, error in

    // request complete!

    }

    request.loadRequest()


    这样申请网络数据就完成了,接下来就是解析数据了。

    第二步.json数据解析框架 。SwiftyJSON这是一个使用极其普遍的开源框架,下载地址:https://github.com/lingoer/SwiftyJSON大家可以自行去下载,使用的话外面的文章实在是太多了,我就推荐一篇大家去看就OK了http://www.jianshu.com/p/ae9a579905e0这里面已经写出了使用方法,大家可以跟着里面的例子进行测试。

    在这里插一下版本更新,苹果公司是不允许直接更新app的,需要跳转到App Store去自行下载,做出版本更新的思路就是:自己服务器上放含有最新版本号的json数据,通过网络请求获取json数据,解析json数据获得最新版本号,与目前的版本号进行对比,判断是否跳出提示更新的框,是的话就跳转到App Store地址,因为自己写篇幅就过长了,这里也给出参考的文章,在这里感谢曾给过帮助的朋友们!参考地址:http://www.jianshu.com/p/6f22f06261f5

    上面两个框架就可以解决很多问题了,下面当然要讲下怎么导入上面这两个框架了,这里就简述了,新建一个工程,比如Helloworld,然后将YYHRequest-Swift,SwiftyJSON中的.xcodeproj文件拉到项目中去,然后点击自己的项目,这里是Helloworld,然后点击General,然后往下拉,看到Embedded Binaries 下面有个加号,将这两个框架添加进来就行了

    第二种导入框架的方法,就是使用cocoapods,有篇文章写得非常好,这里推荐下http://www.jianshu.com/p/1f93e0fec8a5

    到这里就认为是框架导入成功了。

    第三步.界面的搭建,相信大家对基本的控件的使用应该没什么问题吧,如果有问题的话,推荐去下载IOS开发指南这本书的源码,然后怎么去对应上内容,怎么获取PDF大家自己想办法喽,源码下载地址:http://www.51work6.com/forum.php?mod=viewthread&tid=1159&extra=page%3D1这里面拥有所有基本控件简单使用源码,只要合理利用,会有相当大的作用的。

    第四步,数据持久化。这里推荐http://www.jianshu.com/p/7616cbd72845其实在刚才推荐的下载的源码的第十一章ch11中讲的非常清楚,Demo代码也非常适用。目前我用的就是修改Demo代码中的。

    还有很中要的一点就是界面布局,这点非常重要。因为现在iphone的屏幕尺寸种类多了,目前还是推荐使用自动布局Auto Layout来对界面布局推荐一个非常好的学习地址,相信看完这篇文章,布局是一点问题都不会有了,写得非常详细https://lvwenhan.com/ios/430.html相信大家会有很大收获的。

    经过上面这些,框架基本是搭建起来了,下面就介绍一些开发一个App不可避免要用到的一些东西

    1.IOS(swift)-scrollView(tableView) ·下拉刷新上拉加载

    http://www.jianshu.com/p/94b6d7287faf

    2.动态启动界面(有需要时用)

    http://fromwiz.com/share/s/0i4C850y0AUf2VM_1t15ktzt2XPmI93U7QMr2rF2y40mYXtX

    3.纯代码写的tab bar

    http://www.jianshu.com/p/a9808d63408b

    4.app的引导页

    http://www.jianshu.com/p/024dd2d6e6e6

    5.自定义tab bar 并带有动画

    http://www.jianshu.com/p/d487a87105e7

    6.使用ShareSDK完成第三方分享功能

    http://www.jianshu.com/p/f95080d109a6

    TableView是一个非常重要,比其他基本控件要复杂一点的控件,在上面下载的源码的第六章完整的介绍了基本用法。

    最后就只剩下App的发布了,之前我写过一篇关于此类的文章,请大家移步http://www.jianshu.com/p/2813abee7187

    如果有写的不对的地方,还请指出,我会及时修改。写得不好的地方还请大家见谅,需要大家的支持。



    文/Jerry沈(简书作者)
    原文链接:http://www.jianshu.com/p/46bc8cf37cae
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。



    展开全文
  • 自iOS8起,苹果就建议告...下面总结了一些常见的用法(本文代码都已更新Swift3) 1,简单的应用(同时按钮响应Handler使用闭包函数)   1 2 3 4 5 6 7 8 9 10
    自iOS8起,苹果就建议告警框使用UIAlertController来代替UIAlertView和UIActionSheel。下面总结了一些常见的用法(本文代码都已更新至Swift3

    1,简单的应用(同时按钮响应Handler使用闭包函数)
      
    原文:Swift - 告警提示框(UIAlertController)的用法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import UIKit
     
    class ViewControllerUIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
        }
         
        override func viewDidAppear(_ animated: Bool){
            super.viewDidAppear(animated)
             
            let alertController = UIAlertController(title: "系统提示",
                            message: "您确定要离开hangge.com吗?", preferredStyle: .alert)
            let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
            let okAction = UIAlertAction(title: "好的", style: .default, handler: {
                action in
                print("点击了确定")
            })
            alertController.addAction(cancelAction)
            alertController.addAction(okAction)
            self.present(alertController, animated: true, completion: nil)
        }
         
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }

    2,除了弹出,还可以使用从底部向上滑出的样式
    (注意:如果上拉菜单中有“取消”按钮的话,那么它永远都会出现在菜单的底部,不管添加的次序是如何)
     
    原文:Swift - 告警提示框(UIAlertController)的用法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    let alertController = UIAlertController(title: "保存或删除数据", message: "删除数据将不可恢复",
                                            preferredStyle: .actionSheet)
    let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
    let deleteAction = UIAlertAction(title: "删除", style: .destructive, handler: nil)
    let archiveAction = UIAlertAction(title: "保存", style: .default, handler: nil)
    alertController.addAction(cancelAction)
    alertController.addAction(deleteAction)
    alertController.addAction(archiveAction)
    self.present(alertController, animated: true, completion: nil)

    3,按钮使用“告警”样式(文字颜色变红,用来来警示用户)
      
    原文:Swift - 告警提示框(UIAlertController)的用法
    1
    let okAction = UIAlertAction(title: "好的", style: .destructive, handler: nil)

    4,添加任意数量文本输入框(比如可以用来实现个登陆框)
      
    原文:Swift - 告警提示框(UIAlertController)的用法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    import UIKit
     
    class ViewControllerUIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
        }
         
        override func viewDidAppear(_ animated: Bool){
            super.viewDidAppear(animated)
             
            let alertController = UIAlertController(title: "系统登录",
                                message: "请输入用户名和密码", preferredStyle: .alert)
            alertController.addTextField {
                (textField: UITextField!) -> Void in
                textField.placeholder = "用户名"
            }
            alertController.addTextField {
                (textField: UITextField!) -> Void in
                textField.placeholder = "密码"
                textField.isSecureTextEntry = true
            }
            let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
            let okAction = UIAlertAction(title: "好的", style: .default, handler: {
                action in
                //也可以用下标的形式获取textField let login = alertController.textFields![0]
                let login = alertController.textFields!.first!
                let password = alertController.textFields!.last!
                print("用户名:\(login.text) 密码:\(password.text)")
            })
            alertController.addAction(cancelAction)
            alertController.addAction(okAction)
            self.present(alertController, animated: true, completion: nil)
        }
         
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }

    5,使用代码移除提示框
    1
    self.presentedViewController?.dismiss(animated: false, completion: nil)

    6,提示框弹出后,过段时间自动移除
    下面样例弹出一个不带按钮的消息提示框,过个两秒钟提示框自动消失。
    原文:Swift - 告警提示框(UIAlertController)的用法
    1
    2
    3
    4
    5
    6
    7
    8
    let alertController = UIAlertController(title: "保存成功!",
                                            message: nil, preferredStyle: .alert)
    //显示提示框
    self.present(alertController, animated: true, completion: nil)
    //两秒钟后自动消失
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
        self.presentedViewController?.dismiss(animated: false, completion: nil)
    }

    原文出自:www.hangge.com  转载请保留原文链接:http://www.hangge.com/blog/cache/detail_651.html
    展开全文
  • MVVM是微软提出一种移动开发框架,旨在针对传统的MVC框架,解决传统的MVC框架的控制器的臃肿问题. M: Model模型,也就是数据模型;比如一条微博,对应的所有字段合成一条微博整体,这个整体就是Model ...

    MVVM是微软提出一种移动开发框架,旨在针对传统的MVC框架,解决传统的MVC框架的控制器的臃肿问题.

    M:

    Model模型,也就是数据模型;比如一条微博,对应的所有字段合成一条微博整体,这个整体就是Model


    V:

    View视图,只用来显示的视图,如 iOS的UIView,Cell;当然在 iOS中 Storyboard中,view总是和控制器关联,这并不是严格的view

    如果我们纯手写代码定义一个view那么就是一个比较严格的view了


    VM:

    ViewModel视图模型,是将一个 View 和 Model进行绑定;起着桥梁的作用

    例如一个 微博  cell ,对应的数据绑定到一个 Model,将获得的数据绑定到Model个各个属性上.


    传统的MVC中的  C代表 控制器,负责逻辑处理 和 数据绑定,更新视图;代码过于复杂,维护会比较困难;

    而MVVM框架则是,给 Controller控制器减负;

    把网络请求,数据绑定,更新视图,都剥离出去;

    是在 Controller中做的仅仅是简单的跳转和部分代理


    比较符合MVVM开发框架的是 使用TableView的控制器;Cell自定义;定义所需的Model;定义ViewModel调用对应的接口


    下面来示范一个MVVM框架开发,带有网络请求的Demo



    目录说明:

    Resourse:存放图片,音频视频文件,IB文件

    Controllers:存放视图控制器

    Vender:开源框架,或者自己封装的组件

    UtilTools:封装的常用代码,常量定义,配置文件等

    ViewModel:根据不同的View获取不同的数据并且绑定到Model中

    View:自定义个视图如 cell或者纯手写的view

    Model:数据模型,就是View所需的所有字段的整体


    实现效果:

    一个tableView上显示多条动态包括,图片,文字;



    技术要点:

    MVVM框架

    AFNetworking网络请求

    MBProgressHUD等待提示

    自定义cell

    Block闭包传值,封装代码


    实现过程:

    1.导入Oc的相关框架


    在Swift项目中新建一个Oc文件,系统询问你是否新建一个 桥接Oc的文件,选择是,生成一个  Header.h文件;在其中导入 对应的Oc的 头文件即可使用

    如图,工程中有一个 SwiftDemo-Bridging-Header.h文件

    导入AF等框架

    SwiftDemo-Bridging-Header.h 

    1. //  

    2. //  Use this file to import your target's public headers that you would like to expose to Swift.  

    3. //  

    4.   

    5.   

    6.   

    7.   

    8. #import "AFNetworking.h"  

    9. #import "MBProgressHUD.h"  

    10. #import "UIImageView+AFNetworking.h"  


    2.使用Storyboard创建一个自定义的cell绑定到cell类,标识符是 TestCell




    绑定的TestCell.swift类

    1. //  

    2. //  TestCell.swift  

    3. //  SwiftDemoUsingAF  

    4. //  

    5. //  Created by MBinYang on 15/4/8.  

    6. //  Copyright (c) 2015年 cc.huanyouwang. All rights reserved.  

    7. //  

    8.   

    9. import UIKit  

    10.   

    11. class TestCell: UITableViewCell  

    12. {  

    13.   

    14.     @IBOutlet var imageView2: UIImageView!  

    15.     @IBOutlet var textLabel2: UILabel!  

    16.     @IBOutlet var location: UILabel!  

    17.     override func awakeFromNib()  

    18.     {  

    19.         super.awakeFromNib()  

    20.           

    21.    }  

    22.   

    23.     override func setSelected(selected: Bool, animated: Bool)  

    24.     {  

    25.         super.setSelected(selected, animated: animated)  

    26.           

    27.    }  

    28.       

    29.    /** 

    30.     *配置Cell的内容方法 

    31.   */  

    32.     func configCellWithStatusModel(model:StatusModel!)  

    33.     {  

    34.         self.imageView2.setImageWithURL(NSURL(string: model.imageURL), placeholderImage: UIImage(named: "placeHolder"))  

    35.         self.textLabel2.text = model.text  

    36.         self.location.text = model.location  

    37.     }  

    38.   

    39. }  



    Cell上包含一个 imageView和两个label


    3.常量定义,类似Oc的宏定义


    StringConstant.swift

    常量以小写k开头,其余大写;可以配上下划线

    Swift的常量,使用 let定义常量;可以在其他地方使用

    1. //  

    2. //  StringConstant.swift  

    3. //  SwiftDemo  

    4. //  

    5. //  Created by MBinYang on 15/4/8.  

    6. //  Copyright (c) 2015年 cc.huanyouwang. All rights reserved.  

    7. //  

    8.   

    9. import Foundation  

    10. import UIKit  

    11.   

    12.   

    13. let kGETSTATUSURL = "http://lovemyqq.sinaapp.com/getState.php"  

    14. let kACCESSTOKEN = "2.00HZE3aF0GvJSM551ca8e0920NF13N"  

    15. let kUID = "5117873025"  

    16. let kACCESSTOKENKEY = "access_token"  

    17. let kUIDKEY = "uid"  

    18. let kPARAMDIC = [kACCESSTOKENKEY : kACCESSTOKEN,kUIDKEY : kUID]  

    19. let kREDCOLOR = UIColor.redColor  

    20. let kIMAGEKEY = "image"  

    21. let kDATEKEY = "date"  

    22. let kLOCATIONKEY = "address"  

    23. let kCONTENTKEY = "content"  

    24. let kRESULTKEY = "result"  

    25. let kSTATEKEY = "state"  

    26.   

    27.   

    28. //其他复杂类型,可以使用函数定义  

    29. //func RGBA (r:CGFloat, g:CGFloat, b:CGFloat, a:CGFloat)  

    30. //{  

    31. //    return UIColor (red: r/255.0, green: g/255.0, blue: b/255.0, alpha: a)  

    32. //}  

    33.   

    34.   

    35.   

    36. //使用方法如下  

    37. //var theColor : UIColor = RGBA (255, 255, 0, 1)  



    4.封装AF为一个常用的方法,便于ViewModel调用


    AFRequest.swift

    1. //  

    2. //  AFRequest.swift  

    3. //  SwiftDemo  

    4. //  

    5. //  Created by MBinYang on 15/4/8.  

    6. //  Copyright (c) 2015年 cc.huanyouwang. All rights reserved.  

    7. //  

    8.   

    9. import UIKit  

    10.   

    11. public typealias SuccessBlock = (obj:AnyObject)->Void!  

    12. class AFRequest: NSObject  

    13. {  

    14.     var mainURL:String!  

    15.     var paramDict:[String:String]!  

    16.     var successBlock:SuccessBlock!  

    17.     var manager:AFHTTPRequestOperationManager  

    18.     var hud:MBProgressHUD!  

    19.   

    20.      

    21.     init(mainURL:String,paramDict:[String:String],successBlock:SuccessBlock)  

    22.     {  

    23.         self.mainURL = mainURL  

    24.         self.paramDict = paramDict  

    25.         self.successBlock = successBlock  

    26.         self.manager = AFHTTPRequestOperationManager()  

    27.         super.init()  

    28.     }  

    29.   

    30.       

    31.     func startRequestWithHUDOnView(view:UIView!)  

    32.     {  

    33.         self.hud = MBProgressHUD.showHUDAddedTo(view, animatedtrue)  

    34.         self.hud.labelText = "正在请求..."  

    35.    

    36.        var op =  self.manager.GET(self.mainURL,  

    37.             parametersself.paramDict,  

    38.             success: {  (operation: AFHTTPRequestOperation!,  

    39.                 responseObject: AnyObject!) in  

    40.                   

    41.                 var arr: AnyObject! = NSJSONSerialization.JSONObjectWithData(responseObject as NSData, options: NSJSONReadingOptions.AllowFragments, error: nil)  

    42.                   

    43.                 println(arr!)  

    44.                 unowned var unSelf:AFRequest = self  

    45.                unSelf.successBlock(obj: arr!)  

    46.                unSelf.hud.customView = nil  

    47.                unSelf.hud.labelText = "加载成功!"  

    48.                unSelf.hud.hide(false, afterDelay3)  

    49.             },  

    50.             failure: {  (operation: AFHTTPRequestOperation!,  

    51.                 error: NSError!) in  

    52.                 println("请求错误Error: " + error.localizedDescription)  

    53.                 unowned var unSelf:AFRequest = self  

    54.                 unSelf.hud.hide(true)  

    55.         })  

    56.           

    57.         op.responseSerializer = AFHTTPResponseSerializer()  

    58.         op.start()  

    59.     }  

    60.       

    61.       

    62. }  



    5.根据View/Cell所需的数据,封装一个Model类.


    如 封装一个 和 Cell数据字段对应的Model类  StatusModel状态模型

    StatusModel.swift

    包含,属性,和存取器

    1. //  

    2. //  StatusModel.swift  

    3. //  SwiftDemoUsingAF  

    4. //  

    5. //  Created by MBinYang on 15/4/8.  

    6. //  Copyright (c) 2015年 cc.huanyouwang. All rights reserved.  

    7. //  

    8.   

    9. import UIKit  

    10.   

    11. class StatusModel: NSObject  

    12. {  

    13.       

    14.     var imageURL:String!  

    15.     var text:String!  

    16.     var location:String!  

    17.       

    18.       

    19.       

    20.   override  init()  

    21.     {  

    22.         //Todo  

    23.     }  

    24.       

    25.       

    26.       

    27.     init(imageURL:String!,text:String,location:String)  

    28.     {  

    29.         self.imageURL = imageURL  

    30.         self.text = text  

    31.         self.location = location  

    32.     }  

    33.       

    34.     var configModel:(String!,String!,String!)  

    35.     {  

    36.         set  

    37.         {  

    38.             self.imageURL = newValue.0  

    39.             self.text = newValue.1  

    40.             self.location = newValue.2  

    41.         }  

    42.         get  

    43.         {  

    44.             return (self.imageURL,self.text,self.location)  

    45.         }  

    46.     }  

    47.       

    48.     //省略set的 简写的 get  

    49.     var urlOfImg:String  

    50.     {  

    51.         return self.imageURL  

    52.     }  

    53.      

    54. }  



    6.ViewModel根据View所需数据,调用对应的接口;并且把数据绑定到Model中


    解析JSON数据,绑定到Model中

    StatusViewModel.swift

    1. //  

    2. //  StatusViewModel.swift  

    3. //  SwiftDemo  

    4. //  

    5. //  Created by MBinYang on 15/4/8.  

    6. //  Copyright (c) 2015年 cc.huanyouwang. All rights reserved.  

    7. //  

    8.   

    9. import UIKit  

    10.   

    11. public class StatusViewModel: NSObject  

    12. {  

    13.   

    14.     func requestStatusList(view:UIView!,blk:SuccessBlock)  

    15.     {  

    16.           

    17.     var af = AFRequest(mainURL: kGETSTATUSURL, paramDict: kPARAMDIC)  

    18.         { (obj) -> Void! in  

    19.               

    20.               

    21.             var dicO = obj as Dictionary<String,AnyObject>  

    22.             var arr1: AnyObject? = dicO[kRESULTKEY]  

    23.             var  arrreal = arr1 as Array<Dictionary<String,Dictionary<String,String>>>  

    24.             var modelArray = Array<StatusModel>()  

    25.               

    26.             /** 解析得到的JSON数据为Model数组*/  

    27.             for dict in arrreal  

    28.             {  

    29.                 var dic = dict[kSTATEKEY]! as Dictionary<String,String>  

    30.                 var sModel = StatusModel()  

    31.                 sModel.imageURL = dic[kIMAGEKEY]!  

    32.                 sModel.text = dic[kCONTENTKEY]!  

    33.                 sModel.location = dic[kLOCATIONKEY]!  

    34.                 modelArray.append(sModel)  

    35.                   

    36.             }  

    37.             println(modelArray[0])  

    38.            blk(obj: modelArray)  

    39.               

    40.             return Void()  

    41.         }  

    42.     af.startRequestWithHUDOnView(view)  

    43.     

    44.    }  

    45.      

    46. }  



    7.TableViewController 控制器中调用  ViewModel显示数据


    1. //  

    2. //  TableViewController.swift  

    3. //  SwiftDemo  

    4. //  

    5. //  Created by MBinYang on 15/4/8.  

    6. //  Copyright (c) 2015年 cc.huanyouwang. All rights reserved.  

    7. //  

    8.   

    9. import UIKit  

    10.   

    11. class TableViewController: UITableViewController  

    12. {  

    13.   

    14.     var modelArray = Array<StatusModel>()  

    15.       

    16.     override func viewDidLoad()  

    17.     {  

    18.         super.viewDidLoad()  

    19.           

    20.          loadData()  

    21.           

    22.     }  

    23.   

    24.     override func didReceiveMemoryWarning()  

    25.     {  

    26.         super.didReceiveMemoryWarning()  

    27.           

    28.     }  

    29.   

    30.   

    31.     override func numberOfSectionsInTableView(tableView: UITableView) -> Int  

    32.     {  

    33.           

    34.         return 1  

    35.     }  

    36.   

    37.     override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int  

    38.     {  

    39.         return modelArray.count  

    40.     }  

    41.   

    42.       

    43.     override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell  

    44.     {  

    45.           

    46.       var sModel = self.modelArray[indexPath.row]  

    47.         var cell = tableView.dequeueReusableCellWithIdentifier("TestCell", forIndexPath: indexPath) as TestCell  

    48.   

    49.         cell.configCellWithStatusModel(sModel as StatusModel)  

    50.   

    51.         return cell  

    52.     }  

    53.       

    54.    /** 

    55.     * 第一次加载数据时请求 

    56.     * 返回为空 

    57.     */  

    58.     func loadData()  

    59.     {  

    60.         StatusViewModel().requestStatusList(self.view, blk: { (obj) -> Void! in  

    61.             unowned var weak_self:TableViewController = self  

    62.             println("这是第一次加载数据的 block\(__FUNCTION__)")  

    63.             weak_self.modelArray = obj as Array<StatusModel>  

    64.             weak_self.tableView.reloadData()  

    65.             return Void()  

    66.         })  

    67.     }  

    68.   

    69. }  


    调用ViewModel之后再  reloadData()


    当然,ViewModel也可能是 在 View上调用的;比如 Cell上有一个  按钮,点击按钮会进行网络请求,也需要调用 ViewModel


    8.总结


    我们可以看到 在 TableViewController 中,代码非常的少.原来对应  网络请求,对于 视图更新都是放在 controller中;

    使用MVVM后可以大大减少Controller的代码,是的各部分耦合性更低,更便于维护.



    9.其他,view上有事件的触发


    如果 Cell或者 View上或者有 点击事件,或者其他事件;可以 使用 闭包封装 ;类似于 上面的 AF请求.

    展开全文
  • 这几天由于项目整个框架大修改,遇到一个问题: 在真机上反复测试时,发现系统定位的授权提示框出现的时间有问题,并不是像我们期望的那样,当进入程序内部才弹出来,它出现的情况分以下几种: 进入app内部,弹出...
  • Swift实现一款天气预报APP(一) 用Swift实现一款天气预报APP(二) 用Swift实现一款天气预报APP(三) Swift作为现在苹果极力推广的语言,发展的非常快。这个语言就和她的名字一样,比OC减少了很多的文件和代码...
  • Swift:在Safari中打开App

    2015-05-25 14:47:02
    当你输入一个特殊的“url”之后,Safari弹出一个提示,问你是否继续打开这个App。如果你这个时候confirm的话。那么这个App就会打开。 我们打开看看这个app是什么样的App。看图: 是一个灰常简答的TableView...
  • iOS开发过程中,有些时候操作App的时候,需要给用户对应的响应提示操作,使用系统自带的提示框不是每种情况都适用的。 除了使用系统自带的提示框,还有别的提示框选项,比如Toast提示框,Toast提示框在OC里面的使用...
  • Swift开发iOS App学习笔记(一)—AppIcon & LaunchScreen
  • iOS开发从入门到精通 基于Xcode9和Swift4视频培训教程,本教程手把手教您学习Xcode9和Swift4语言!一看就懂,一学就会! 视频教程拥有180节课程,包含iOS开发基础知识、数据处理、网络访问、多线程、社会化分享、...
  • swift 框架大全

    2017-06-26 11:27:09
    版本:Swift github排名 https://github.com/trending,github搜索:https://github.com/search 主要工作说明:  1. 将Swift从Objective-C混合的md文件中抽出(正在进行…) 使用方法:根据目录关键字...
  • 我从2009年开始做Android开发,开始接触Swift是在2014年底,当时组里曾经做过一个Demo App,感觉技术还不够成熟没有正式发布。2016年初我们正式使用swift开发上线了销售助手App产品,积累了比较丰富的swift项目实战...
  • 弹出不管是在网页端,还是在手机APP端,都是常用的控件.在网页中实现个简单的弹出只需要调用alert,在IOS中,也不是那么复杂,也是容易使用的. 我先用xcode6创建一个名为iOS8SwiftAlertViewTutorial,设置好相关...
  • 感谢原作者提供OC代码 先来张图让小伙伴们看一眼主要有四个View 黑色 XtPopViewController的self.view的颜色 白色 主控制器self.view颜色 在白色View上方 有个透明度为0.5的view 进行遮挡....下方的灰色View ...
  • 事前准备 查看swift版本 swift脚本编程小知识 ...生成不同尺寸的image 自从Xcode8之后就不支持插件了,没法用Xcode一键生成AppIcon,一直没找到好的解决方案,一怒之下决定自己写一个脚本用来生成AppIcon,下面是
1 2 3 4 5 ... 20
收藏数 4,126
精华内容 1,650