【问题标题】:Getting nil value when passing value to api将值传递给 api 时获取 nil 值
【发布时间】:2016-05-16 22:36:18
【问题描述】:

我做过的事情:

  1. 我有一个 url api,它将在我的表格视图中显示一些数据。 2.我从我的 url 中获取名为“_id”的特定值,然后将该值传递给一个自定义类对象。

  2. 然后我将该类对象值传递给我的另一个调用 url 的 api 之一。在那里我将值设为 nil。

这是我将数据填充到我的表格视图的代码。我从 api "_id" 获取特定值并将该值存储到一个自定义类对象:

// Showing favourites
    func populateFavourites()
    {
        let token = NSUserDefaults.standardUserDefaults().valueForKey("access_token") as! String

        let headers = ["x-access-token": token]

        let request = NSMutableURLRequest(URL: NSURL(string: "some url")!)
        request.HTTPMethod = "GET"
        request.allHTTPHeaderFields = headers

        let session = NSURLSession.sharedSession()
        let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in

            if (error != nil)
            {
                print(error)
            }
            else
            {
                dispatch_async(dispatch_get_main_queue(),{
                    if let json = (try? NSJSONSerialization.JSONObjectWithData(data!, options: [])) as? Dictionary<String,AnyObject>
                    {

                        print("Success Got Json Data")

                        let success = json["success"] as? Int

                        if(success == 1)
                        {
                            let jsonData = json["data"] as! NSArray

                            if(jsonData.count>0)
                            {



                                for items in jsonData
                                {
                                    let BObj = items as! NSDictionary

                                    let BusinessDetails = BObj.valueForKey("business_id") as! Dictionary<String,AnyObject>

                                    self.FavBusinessValues.append(Businessdata(json:BusinessDetails))
                                                                      print(items)

                                     let FavId = BObj.valueForKey("_id") as! String


                                    self.FavDelete?.FavIds = FavId

                                    print(FavId)




                                }

                                self.tableView.reloadData()

                            }
                            else
                            {
                                self.CreateNoDataLabel()
                            }
                        }
                        else
                        {
                            let message = json["message"] as? String

                            print("Fav Message ",message)

                            let alert = UIAlertController(title: "Error: ", message: message, preferredStyle: UIAlertControllerStyle.Alert)

                            // add an action (button)
                            alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))

                            // show the alert
                            self.presentViewController(alert, animated: true, completion: nil)
                        }
                    }
                })
            }
        })
        dataTask.resume()

    }

在我上面的代码中,我采用了特定的值“_id”,并且我正在传递给我的自定义对象类:

 let FavId = BObj.valueForKey("_id") as! String
 self.FavDelete?.FavIds = FavId
 print(FavId)

这个print(FavId) 正在打印正确的值。这是我存储“_id”值的自定义类对象:

import Foundation
class Favdelete
{
        var FavIds : String?


    init(json:String)
    {

        self.FavIds = json as? String

    }
}

然后我将“_id”对象值 FavIds 传递给我的一个 api 调用。该代码在下面:

 func apidelete () {



           let Favouriteid = FavDelete?.FavIds
                           print(Favouriteid)

              let userToken = NSUserDefaults.standardUserDefaults().valueForKey("access_token") as! String;
        print(userToken)


                        let headers = [
                            "x-access-token": userToken,
                            "cache-control": "no-cache",
                            "postman-token": "81fbd1fc-c333-3ceb-272a-a9ecffb2dad2",
                            "content-type": "application/x-www-form-urlencoded"
                        ]




        let FBI = "favourite_id="+Favouriteid!


        let postData = NSMutableData(data: FBI.dataUsingEncoding(NSUTF8StringEncoding)!)

                        let request = NSMutableURLRequest(URL: NSURL(string: "some url")!,
                                                          cachePolicy: .UseProtocolCachePolicy,
                                                          timeoutInterval: 10.0)

        let session = NSURLSession.sharedSession()
        let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
            if (error != nil) {
                print(error)
            } else {
                let httpResponse = response as? NSHTTPURLResponse
                print(httpResponse)
                dispatch_async(dispatch_get_main_queue(),{
                    if let json = (try? NSJSONSerialization.JSONObjectWithData(data!, options: [])) as? Dictionary<String,AnyObject>
                    {

                        print("Success Got Json Data");

                        let success = json["success"] as? Int;

                        var message:String = "";

                        if(success == 1)
                        {
                            message = json["message"] as! String;
                        }
                        else
                        {
                            message = json["message"] as! String;
                        }

                        print(message);

                        let alert = UIAlertController(title: "Message from server", message: message, preferredStyle: UIAlertControllerStyle.Alert)

                        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))

                        self.presentViewController(alert, animated: true, completion: nil)

                    }
                })

            }
        })

        dataTask.resume()




    }

当我尝试打印时:

let Favouriteid = FavDelete?.FavIds
  print(Favouriteid)

我遇到了崩溃,它在我的控制台中显示 nil 打印。

谁能帮帮我!!

更新:

在我的第一个函数方法下。那是当我获取特定值并将该值存储到我的自定义对象时。我只是打印它。我在那里也得到了 nil。

该行是:

let FavId = BObj.valueForKey("_id") as! String
 self.FavDelete?.FavIds = FavId
print(self.FavDelete?.FavIds)

打印为零

更新:

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    虽然您有一个自定义类,但您需要对其进行初始化以使用其方法。如果没有正确的初始化,您将无法设置其属性。 因此,在 ViewController 中,在顶部声明该类的对象。 var FavbDelete : Favdelete? 此时,您的 FavDelete 为 nil。

    然后你从populateFavourites() 方法中得到“_id”。您可能从 viewDidLoad() 方法调用它。在那里你得到 FabId let FavId = BObj.valueForKey("_id") as! String 但是现在你不能直接将它存储到FabDelete 对象中。因为它还没有被初始化。虽然 Xcode 在你这样做时不会抛出任何错误,但结果值将是 nil。因此,现在您使用您在自定义类中构建的初始化程序来初始化该对象。

    self.FavDelete = Favdelete(json: FavId)

    现在FavDelete对象已经初始化了,当你在这一步之后调用apidelete()方法时,你可以通过使用获取id的值

    let someVar = self.FavDelete?.FavIds
    

    由于所有这些工作都是在后台使用NSURLSession 完成的,因此请确保在初始化FabDelete 对象之前没有调用apidelete

    【讨论】:

    • 我试过了,但我收到错误消息`无法调用非函数类型的值'Favdelete?'`
    • 在您的更新代码中,您能否在此行之后打印let FavId = BObj.valueForKey("_id") as! String 以查看Fav Id 是否不为零?
    • 当我打印 let FavId = BObj.valueForKey("_id") as! String 现在我得到了正确的 id
    • 我收到此错误“无法调用非函数类型'Favdelete?'的值”
    • 您是否为 FabDelete 设置了变量? var FavDelete:Favdelete?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2019-02-20
    • 2019-12-21
    • 1970-01-01
    相关资源
    最近更新 更多