0

由于这个展开错误,我无法将 JSON 值(我正在成功读取)传递到我textfield的下一个,说明我的文本字段是.viewcontrollernil

我很困。这是我的阅读 JSON 的课程:

class DoOAuth
{
func doOAuthFitbit() -> String{
    var name = ""
    let oauthswift = OAuth1Swift(
        consumerKey:            "eabf603efe9e45168d057b60b03f8e94",
        consumerSecret:         "46b4dfa8c9d59666769e03f887d531a8",
        requestTokenUrl:        "https://api.fitbit.com/oauth/request_token",
        authorizeUrl:           "https://www.fitbit.com/oauth/authorize?display=touch",
        accessTokenUrl:         "https://api.fitbit.com/oauth/access_token")

    oauthswift.authorizeWithCallbackURL( NSURL(string: "fitbit://oauth")!,
        success:{
            credential, response in

            let vc: ViewController = ViewController()


            let user: OAuthSwiftClient = OAuthSwiftClient(consumerKey: oauthswift.consumer_key, consumerSecret: oauthswift.consumer_secret, accessToken: credential.oauth_token, accessTokenSecret: credential.oauth_token_secret)

            let object:[String : AnyObject] = ["oauth_token": credential.oauth_token, "oauth_token_secret" : credential.oauth_token_secret]

            user.get("https://api.fitbit.com/1/user/-/profile.json", parameters: object,
                success: {

                    (data: NSData, response: NSHTTPURLResponse) -> Void in
                    let jsonValues = JSON(data: data, options: NSJSONReadingOptions.AllowFragments, error: nil)
                    println(jsonValues)

                    /*public var dictionary: [Swift.String: JSON]?
                    {
                        switch self
                        {
                        case .Dictionary(let d):
                            var jsonObject: [Swift.String: JSON] = [:]
                            for(k,v) in d
                            {
                                jsonObject[k] = JSON.wrap(v)
                            }
                            return jsonObject
                        default:
                            return nil
                        }
                    }*/

                    for(key, subJson) in jsonValues
                    {
                        if let nm = subJson["fullName"].string
                        {
                            println("\(nm)")

                            name = nm
                        }
                    }

                    /*for(index: String, subJson: JSON) in jsonValues
                    {
                        let name = subJson.dictionary?["fullName"]?.string

                        println("\(name!)")
                        //vc.nm.text = name!
                        main.acceptJson(name!)

                    }*/
                },
                failure: {
                    (error:NSError!) -> Void in
                    println(error.localizedDescription)
                    println("error")
            })
        },
        failure: {
            (error:NSError!) -> Void in
            println(error.localizedDescription)
    })
    return name
}

}

我调用了一个函数,它应该接收acceptJson位于下一个视图控制器中的 JSON 字符串 ():

class mainMenu: UIViewController
{
var oauthfitbit: DoOAuth = DoOAuth()
var name = ""

//let vc: ViewController = ViewController()

@IBOutlet weak var lbl: UILabel!
@IBOutlet weak var nameField: UITextField!{
    didSet{
        nameField.text = name
    }
}



 override func viewWillAppear(animated: Bool)
 {
        //name = oauthfitbit.doOAuthFitbit()
        //self.nameField.text = "Working"
        //self.nameField.text = name
 }

func acceptJson(info: String!)
{
    println("\(info)")
    self.nameField.text = info
    //name = info

}

}

nameField.text我在设置行上抛出异常,说明nameFieldnil。如何获取textfield存储 JSON 字符串的方法?
这是最初的视图控制器:

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBOutlet weak var nm: UITextField!
//let main: mainMenu = mainMenu()

var name = ""
@IBAction func connectPressed(sender: UIButton)
{
    var oauthFitbit: DoOAuth = DoOAuth()
    name = oauthFitbit.doOAuthFitbit()
    self.performSegueWithIdentifier("loginSuccess", sender: nil)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "loginSuccess")
    {
        let controller = segue.destinationViewController as! mainMenu
        controller.name = name
        //vc.nameField.text = "Hello"

    }
}

}

4

2 回答 2

1

您是如何创建文本字段的?是通过界面生成器吗?在使用 Interface Builder 和 IBOutlets 时,我曾多次遇到此类问题。

第一步是确保您的文本字段从 .xib 文件正确连接到您的视图控制器。删除连接并通过控制(命令?)从 IB 拖动到您的视图控制器代码重新连接。

如果您没有使用 IB 并且仍然遇到问题,请将代码发布到您创建文本字段的位置。如果您以编程方式创建它,您必须将视图控制器设置为文本字段委托,我相信。自从我这样做以来已经有一段时间了。

让我们知道!

于 2015-07-06T15:57:52.087 回答
1

获取新视图控制器值的最简单方法nmprepareForSegue

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

因此,要使其工作,您需要将name实例变量 ( var name = "") 添加到您的第一个视图控制器,然后更改main.acceptJson(nm)name = nm.

name在您的第一个视图控制器中设置后,您可以继续使用第二个视图控制器。

在第二个视图控制器中,您可以将文本字段出口更改为:

@IBOutlet weak var nameField: UITextField! {
  didSet {
    nameField.text = name
  }
}

didSet一个属性观察者。您不能nameField直接从第一个视图控制器设置文本字段,因为在第一个视图控制器中调用prepareForSegue时尚未设置文本字段。prepareForSegue这就是您将其存储在实例变量中的原因。然后,由于didSet,您的文本字段的 text 属性将在它存在时立即设置。

更新:

以下是属于自己的一类。让我们调用那个类DoOAuth(看起来这就是你所说的):

class DoOAuth {

func doOAuthFitbit() -> String { // Now it's returning a string

    var name = "" // Create local variable to return

    let oauthswift = OAuth1Swift(
        consumerKey:            "eabf603efe9e45168d057b60b03f8e94",
        consumerSecret:         "46b4dfa8c9d59666769e03f887d531a8",
        requestTokenUrl:        "https://api.fitbit.com/oauth/request_token",
        authorizeUrl:           "https://www.fitbit.com/oauth/authorize?display=touch",
        accessTokenUrl:         "https://api.fitbit.com/oauth/access_token")

    oauthswift.authorizeWithCallbackURL( NSURL(string: "fitbit://oauth")!,
        success:{
            credential, response in

            //let vc: ViewController = ViewController() // Get rid of this

            let user: OAuthSwiftClient = OAuthSwiftClient(consumerKey: oauthswift.consumer_key, consumerSecret: oauthswift.consumer_secret, accessToken: credential.oauth_token, accessTokenSecret: credential.oauth_token_secret)

            let object:[String : AnyObject] = ["oauth_token": credential.oauth_token, "oauth_token_secret" : credential.oauth_token_secret]

            user.get("https://api.fitbit.com/1/user/-/profile.json", parameters: object,
                success: {

                    (data: NSData, response: NSHTTPURLResponse) -> Void in
                    let jsonValues = JSON(data: data, options: NSJSONReadingOptions.AllowFragments, error: nil)
                    println(jsonValues)

                    /*public var dictionary: [Swift.String: JSON]?
                    {
                        switch self
                        {
                        case .Dictionary(let d):
                            var jsonObject: [Swift.String: JSON] = [:]
                            for(k,v) in d
                            {
                                jsonObject[k] = JSON.wrap(v)
                            }
                            return jsonObject
                        default:
                            return nil
                        }
                    }*/

                    for(key, subJson) in jsonValues
                    {
                        if let nm = subJson["fullName"].string
                        {
                            println("\(nm)")

                            name = nm // Store 'nm' in local variable declared above
                        }
                    }
        }
        return name
    } // end doOAuthFitbit()

} // end class

connectPressed()现在将ViewController 中的方法更改为:

@IBAction func connectPressed(sender: UIButton)
{
    var oauthFitbit: DoOAuth = DoOAuth()
    name = oauthFitbit.doOAuthFitbit() // doOAuthFitbit() now returns a String
    self.performSegueWithIdentifier("loginSuccess", sender: nil)
}

现在它应该可以工作了。

于 2015-07-06T16:20:39.997 回答