zoukankan      html  css  js  c++  java
  • 每一个成功的程序员的身后都有一个Parse

    相信好多同行都用过Parse,而正是因为Parse给我们的开发带来的极大的便利,才有了项目从零开始,到正式上线仅仅用上不到两周的时间,现在Swift还在迅速的发展,很快就会占有大量的市场,现在就就结合Swift和Parse在结合现在苹果官方主推的storyBoard做一个简单的小demo,了解一下他们之间的结合使用

    有关于使用Parse的一些框架我都分享到下面的网盘中链接如下:

    http://pan.baidu.com/s/1c09cCxi

     

     

    首先先导入下载好的Parse的框架,接着我们在引入系统的框架:

    引入完系统的框架我们在建立一个系统提供的全局头文件,在里面引入我们需要的Parse框架:

     

    #import <Parse/Parse.h>
    
    #import <Bolts/Bolts.h>

    具体的配置如下图:

     

     

     

    配置好头文件后,开始创建登陆注册页面:

    在AppDelegate.swift文件中,需要引入我们设置好的app key【关键】

       func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
           
        
            // 使用Swift创建window
            self.window = UIWindow(frame:UIScreen .mainScreen().bounds)
            
            // 使window可见
            self.window?.makeKeyAndVisible()
            
            // 创建颜色
            self.window?.backgroundColor = UIColor.whiteColor()
            
            let loginVc = LoginViewController()
          // 创建根视图
            self.window?.rootViewController = loginVc
            
            // 添加App KEY
            
            Parse.setApplicationId("W3mUceKMITDeqmRLVqRgL0KW1AeGtbLWQSSmzm6B", clientKey: "cskM6C5BKSz8Nn0KL1b4eJ1y31mW9G6YtsE3OTMp")
            
            
            return true
        }

    之后就可以创建登录和注册页面了在Swift设置button点击事件的时候和OC有些许的不同,方法选择器的方法不在使用@创建方法直接使用字符串的形式:

     

            let loginButton = UIButton(type: UIButtonType.Custom)
            
            loginButton.frame = CGRectMake(10, 210, self.view.frame.size.width - 20, 30)
            loginButton.setTitle("登录", forState: UIControlState.Normal)
            
            // 方法选择器与OC中的又所不同
            loginButton.addTarget(self, action: Selector("loginButtonClicked"), forControlEvents: UIControlEvents.TouchUpInside)
            loginButton.backgroundColor = UIColor.grayColor()
            self.view.addSubview(loginButton)

    因为登录和注册无非就是使用那几个方法,我们就可以把它封装在一个类中方便使用,定义一个LoginHelp的类这个类里面既包含登录注册页面的跳转还包含信息界面,尤其在注册的时候,我们可以在用户注册成功后直接让用户登录,可以直接跳转发布信息的主界面

    具体代码如下:

     

        //注册的方法
        func registWithUser(userName : String, passwd : String) {
            
            
            let user = PFUser()
            
            user.password = passwd
            
            user.username = userName
            
            // 注册的方法
            
            user.signUpInBackgroundWithBlock { (succeed, error) -> Void in
                
                if succeed {
                    
                    // 当注册成功的时候自动登录
                    self.loginWithUser(userName, passwd: passwd)
                    
                }
            }
            
            
            
            
        }
        
    }

    为了减少用户的重复输入输出我们可以在用户登录的时候直接将用户信息进行存储,这时我们可以使用

    轻量级数据存储NSUserDefaults用来存储我们的用户名及密码:具体代码如下:

     // 创建登录的方法
     func loginWithUser(userName : String, passwd : String) {
            
            
       PFUser.logInWithUsernameInBackground(userName, password: passwd) { (MyUser, error) -> Void in
            
            // 登录成功 
            if MyUser != nil && error == nil {
                
    // as 表示强转类型,as!表示前面可以为空  as? 代表前面一定不能为空
        let app = UIApplication.sharedApplication().delegate as! AppDelegate
             
         let messageVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("messageVC")
                
     let naviVC = UINavigationController.init(rootViewController: messageVC)
                
      app.window?.rootViewController = naviVC         
      // 保存     
     UserManager.defaultManager().saveUser(userName, userId: (MyUser?.objectId)!)
                
               // 使用NSUserDefaults存储东西的方法
                
                let user = NSUserDefaults.standardUserDefaults()
                
                user.setObject(userName, forKey: "userName")
                user.setObject(MyUser?.objectId, forKey: "userId")
            
              }
    }
    }

     

    此时我们就将用户的注册和登录的方法都已经实现了,剩下的就是发送信息的环节,在信息的发送和展示中我们同样可以封装一个类用来存储用户的信息及用户发送的消息:

    代码如下:

     

    class UserManager: NSObject {
        
        // 定义两个私有属性
        private var userID : String?
        private var userName : String?
        // 定义一个私有的类属型
        private static var user : UserManager?
        
    
    // Swift中最简单的单例类
        static func defaultManager() -> UserManager {
            if user == nil {
                
                user = UserManager()
    
            }
            
            
            return user!
        }
        
        // 保存用户
        func saveUser(userName: String, userId : String) {
            
            
            self.userName = userName
            
            self.userID = userId
        }
        
        
        // 返回用户数据
        func findUserSince() -> (String, String) {
            
            return (self.userName!,self.userID!)
        }
        
        
        
        
        
        
    }

     

    封装好信息的类之后就可以创建展示信息界面和发送信息界面,这种效果有点象微博的发送与展示,展示信息的界面主要是把我们发布的信息通过一个tableView展示出来,设置tableViewcell的自适应高度有一个小技巧:

     

            // 预估高度
            self.tableView.estimatedRowHeight = 100;
            // 自适应高度
            self.tableView.rowHeight = UITableViewAutomaticDimension
            
            self.automaticallyAdjustsScrollViewInsets = false

    通过上面的代码可以轻松的达到cell自适应高度的效果

     

    点击展示信息页面中的右上button可以跳转到我们的发布信息的界面:

        func sendBarButtonCliciked() {
            // 强转
            let sendVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("sendVC") as!SendViewController
            
            sendVC.result = { () -> Void in
                
                self.loadata()
                
                
            }
            
            self.navigationController?.pushViewController(sendVC, animated: true)
            
        }

    接着就是发布信息的界面了,此时我们可以将创建一个闭包,将我们在本页面发布的信息传到我们信息展示页面中去【也就相当于OC中的block从后往前传值】

    在Swift中实现闭包的格式为:

    //typealias 相当于OC中的typedef一样

    // 格式: 名字【自己定义】 = (参数)-> 返回值

    typealias Closure = () -> Void

      // 定义一个属性

     var result : Closure!

    在信息展示的页面的调用如下:

     

     

            // 保存的时候自动上传
            object.saveInBackgroundWithBlock { (succeed, error) -> Void in
                
                
                if succeed {
                    
                    self.result()
                    
                      self.navigationController?.popToRootViewControllerAnimated(true)
                    
                }
                
              
              
            }

     

     

     

    发布信息的代码如下:

     

     @IBAction func senfe(sender: AnyObject) {
            
            
            
            let object = PFObject(className: "shine")
            
            object.setObject(self.textView.text, forKey: "message")
            
            
           let(userName,userId) = UserManager.defaultManager().findUserSince()
            
            object.setObject(userName, forKey: "userName")
            object.setObject(userId, forKey: "UID")
            
            // 保存的时候自动上传
            object.saveInBackgroundWithBlock { (succeed, error) -> Void in
                
                
                if succeed {
                    
                    self.result()
                    
                      self.navigationController?.popToRootViewControllerAnimated(true)
                    
                }
                
              
                
                
            }
            
            
            
        }

     

     

    此时我们就把一个小demo做好了,详细的工程文件可以去我的github上去下载

     

     

    欢迎转载,请注明转载和原文出处:http://www.cnblogs.com/windsSunShine/

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    js--数组中的最值
    js--数组合并并且去重
    js---数组去重的方法总结???
    input 输入框又被输入法遮挡啦
    使用装饰者模式改善既有代码
    简易的 webpack + vue 完成本地化数据 mock
    vue 数据持久化(刷新保存数据)的探索
    JavaScript await 与 promise 的纠葛
    javascript 函数的暂停和恢复
    Symbol 小妙处
  • 原文地址:https://www.cnblogs.com/windsSunShine/p/4995945.html
Copyright © 2011-2022 走看看