ios - 将用户名信息保存到服务器而不是 NSDefaults (iOS)

标签 ios swift xcode post user-data

我有一个服务器用于在我的应用程序中存储用户名和密码数据。在测试应用程序时,我使用 NSDefaults 将所有内容保存到本地设备,但现在应用程序即将完全启动,我尝试将它们保存到服务器,因为这样对于用户信息来说更安全。

当我将其保存到 NSDefaults 时,这是一件简单而短暂的工作。然而现在,我试图将数据发布到服务器并不断收到构建错误。我需要改变什么才能让它发挥作用?我是否没有完全理解 POST 和 GET 的工作原理?谢谢。目前使用 Swift 2,不是我的选择,我更喜欢 3,但我的老板还不让我们更新它。

当前错误来自 POST USER DATA TO SERVER 部分,其中 xcode 声称 userNmeTxt 无法转换为 NSData。预先感谢您。

编辑:错误位于第 87 行:“无法将 UITextField 类型的值转换为预期的参数类型 NSData!”

import UIKit

class UserNameViewController: AuthorizationViewController {

@IBOutlet weak var userNameTxt: UITextField!
@IBOutlet weak var continueBtn: UIButton!

var userModel: ProfileModel!

//MARK: - SYSTEMS METHODS

override func viewDidLoad() {
    super.viewDidLoad()
    userNameTxt.delegate = self
    userNameTxt.autocapitalizationType = .Sentences
    setEnabledButton()
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBarHidden = false
    self.navigationItem.leftBarButtonItem  = getBackButton()
    self.title = ""
}

override func viewWillDisappear(animated: Bool) {
    self.navigationController?.navigationBarHidden = true
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    continueBtn.layer.cornerRadius = 10
}

override func popToRoot(sender:UIBarButtonItem){
    self.navigationController!.popViewControllerAnimated(true)
}

//MARK: - CHECK FOR AVALABILITY

func setEnabledButton(){
    if userNameTxt.text == "" {
        continueBtn.backgroundColor = UIColor.lightGrayColor()
    } else {
        continueBtn.backgroundColor = UIColor(colorLiteralRed: 63.0/255.0, green: 220.0/255.0, blue: 236.0/255.0, alpha: 1.0)
    }
    continueBtn.userInteractionEnabled =  userNameTxt.text != ""
}

//MARK: - POST USER DATA TO SERVER

func postData(url: String, params: Dictionary<String, String>, completionHandler: (data: NSData?, response: NSURLResponse?, error: NSError?) -> ()) {

    // Indicate download
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true

    let url = NSURL(string: "myPlaceholderURLgoesHere")!
    //        print("URL: \(url)")
    let request = NSMutableURLRequest(URL: url)
    let session = NSURLSession.sharedSession()
    request.HTTPMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")

    // Verify downloading data is allowed
    do {
        request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(params, options: [])
    } catch let error as NSError {
        print("Error in request post: \(error)")
        request.HTTPBody = nil
    } catch {
        print("Catch all error: \(error)")
    }

    // Post the data
    let task = session.dataTaskWithRequest(request) { data, response, error in
        completionHandler(data: userNameTxt, response: userModel, error: error)

        // Stop download indication
        UIApplication.sharedApplication().networkActivityIndicatorVisible = false
        // Stop download indication

    }

    task.resume()

}

//MARK: - SEGUE

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "toPassword"{
        let controller = segue.destinationViewController as! PasswordViewController
        controller.userModel = userModel
    }
}

//MARK: - IB ACTIONS
@IBAction func continuePressed(sender: AnyObject) {
    userModel.userNickName = userNameTxt.text!
    performSegueWithIdentifier("toPassword", sender: self)
}
}

extension UserNameViewController: UITextFieldDelegate{
func textFieldDidEndEditing(textField: UITextField) {
    self.setEnabledButton()
}
}

最佳答案

您需要更改一些内容。

userNameTxt 不是用户名,它是包含用户名的 UITextField。您需要的文本是userNameTxt.text?

如果函数需要数据,您必须首先将文本转换为数据

let task = session.dataTaskWithRequest(request) { data, response, error in
    completionHandler(data: userNameTxt.text?.data(using: .utf8), response: userModel, error: error)

关于ios - 将用户名信息保存到服务器而不是 NSDefaults (iOS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42095719/

相关文章:

ios - Xcode 免费配置 : The 'Apple Push Notification' feature is only available to users enrolled in Apple Developer Program

ios - 如果登录成功,如何关闭登录 View ? swift

objective-c - 将文件类型/扩展名关联到基于非文档的 Cocoa 应用程序

ios - xcode - 自动布局关闭时没有圆角

ios - 为什么在 SceneKit 中不调用 Contact Delegate?

ios - 无法在 Xcode 10.2 的模拟器上运行 iOS 应用程序

ios - HKWorkoutActivityType 详细文档?

ios - Siri 自定义意图可以为每个输入参数显示自定义 UI 吗?

ios - XCUITest 使用 Springboard 测试 native Callkit UI。如何获取来电标签?

ios - 有没有办法在IOS中隐藏导航栏 Controller 而不隐藏状态栏?