Ios swift 2如何在函数外使用变量?
我有一个类apimager(),它向JSON数据发出请求,我从中了解到,该类使用协议委托方法将数据传递给ViewController类 数据采集很好,但我不知道如何使用它?!在本例中,我尝试在TableView中使用它Ios swift 2如何在函数外使用变量?,ios,swift,swift2,Ios,Swift,Swift2,我有一个类apimager(),它向JSON数据发出请求,我从中了解到,该类使用协议委托方法将数据传递给ViewController类 数据采集很好,但我不知道如何使用它?!在本例中,我尝试在TableView中使用它 class ViewController: UITableViewController, ApiManagerDelegate{ var names:[String] = [] // the variable which will hold the JSON data ov
class ViewController: UITableViewController, ApiManagerDelegate{
var names:[String] = [] // the variable which will hold the JSON data
override func viewDidLoad() {
super.viewDidLoad()
//instantiate the ApiManager Class
//Set the ViewController as its delegate
//perform request to Restaurants info
let manager = ApiManager()
manager.delegate = self
manager.getRestaurantsData()
func didReceiveResponse (info: [String : AnyObject]){
//Read name property from data dictionary (JSON)
if let restaurantsData = info["restaurants"] as? [[String: AnyObject]]{
for restaurant in restaurantsData{
let name = restaurant["name"] as? String
self.names.append(name!)
}
}
print("Data1: \(names)") // prints the data perfectly
}
func didFailToReceiveResponse() {
print("There was an error in recieving API data")
}
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print (names) //no data here
return names.count //not working
}
我有点困惑如何解决这个问题,我尝试将返回值设置为didReieveResponse(),但问题是当我调用函数时,它需要参数(在Delegator类“dictionary”中传递给它)。。我完全糊涂了
以下是delegator类和协议供参考:
import UIKit
//Custom Protocol Declaration
@objc protocol ApiManagerDelegate {
optional func didReceiveResponse(info: [ String : AnyObject ])
optional func didFailToReceiveResponse()
}
class ApiManager: NSObject, NSURLSessionDelegate {
//open restaurant web API
private let requestURL = NSURL(string:"http://some-url-here.com")
var delegate: ApiManagerDelegate?
override init() {
super.init()
}
func getRestaurantsData() {
let defaultConfigObject = NSURLSessionConfiguration.defaultSessionConfiguration()
let defaultSession = NSURLSession (configuration: defaultConfigObject, delegate: self, delegateQueue: NSOperationQueue.mainQueue ())
let request = NSMutableURLRequest(URL: requestURL!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringCacheData, timeoutInterval: 60 )
request.HTTPMethod = "POST"
request.setValue( "application/x-www-form-urlencoded" , forHTTPHeaderField: "Content-Type" )
let dataTask = defaultSession.dataTaskWithRequest(request, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) in
if let responseError = error {
self.delegate?.didFailToReceiveResponse?()
print("Reponse Error: \( responseError )" )
} else {
do {
let dictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! [String: AnyObject]
self.delegate?.didReceiveResponse?(dictionary)
//print( "Response: \( dictionary )" )
print("Response: Success")
} catch let jsonError as NSError {
// Handle parsing error
self.delegate?.didFailToReceiveResponse?()
print( "JSONError: \(jsonError.localizedDescription)")
}
}
})
dataTask.resume()
}
}
谢谢
更新: 对于像我这样的未来开发人员,解决方案是使用TableViewName.reloadData(),如下所述。。 但请注意,只有当我将didReceiveResponse()函数放在ViewDidLoad之外时,它才对我起作用,我不知道为什么希望有一位专家稍后能解释它 享受吧 你喜欢什么
class ViewController: UITableViewController, ApiManagerDelegate{
var names:[String] = []
let manager = ApiManager()
override func viewDidLoad() {
super.viewDidLoad()
manager.delegate = self
manager.getRestaurantsData()
}
func didReceiveResponse (info: [String : AnyObject]){
//Read name property from data dictionary (JSON)
if let restaurantsData = info["restaurants"] as? [[String: AnyObject]]{
for restaurant in restaurantsData{
let name = restaurant["name"] as? String
self.names.append(name!)
}
print("Data1: \(names)") // prints the data perfectly
if (self.names.count>0)
{
yourtableview.reloadData()
}
}
}
func didFailToReceiveResponse() {
print("There was an error in recieving API data")
}
喜欢
class ViewController: UITableViewController, ApiManagerDelegate{
var names:[String] = []
let manager = ApiManager()
override func viewDidLoad() {
super.viewDidLoad()
manager.delegate = self
manager.getRestaurantsData()
}
func didReceiveResponse (info: [String : AnyObject]){
//Read name property from data dictionary (JSON)
if let restaurantsData = info["restaurants"] as? [[String: AnyObject]]{
for restaurant in restaurantsData{
let name = restaurant["name"] as? String
self.names.append(name!)
}
print("Data1: \(names)") // prints the data perfectly
if (self.names.count>0)
{
yourtableview.reloadData()
}
}
}
func didFailToReceiveResponse() {
print("There was an error in recieving API data")
}
您在ViewDidLoad方法中定义了这些方法?您可以使用闭包进行回调,这可能是因为绘制tableview时名称不存在?也许在viewdidload之后在tableview中重新加载数据会有所帮助,或者在ViewWillDisplay中获取名称?tableview.reloaddata();-)tableview.reloadData()我认为您应该按照本教程进行API调用和JSON处理您在ViewDidLoad方法中定义了方法?您可以使用闭包进行回调可能是因为绘制tableview时名称不存在吗?也许在viewdidload之后在tableview中重新加载数据会有所帮助,或者在ViewWillDisplay中获取名称?tableview.reloaddata();-)reloadData()我认为您应该使用遵循本教程的API调用和JSON处理方法。如果我没有弄错,您希望我将manager=apimager()置于viewdidload之外。我刚刚试过并测试过,但没有输出这是ApiManager类的初始化,您需要在其中添加并没有问题OK,我制作了tableView.reloadData()。。不工作我不确定我是否做对了!yourtableview=tableview标识符?您的tableview==yourtableviewName,因此这是名称=mainList@IBOutlet var mainList:UITableView!仍然不工作如果我做对了,您希望我将manager=apimager()放在viewdidload之外。我刚刚试过并测试过,但没有输出这是ApiManager类的初始化,您需要在其中添加并没有问题OK,我制作了tableView.reloadData()。。不工作我不确定我是否做对了!yourtableview=tableview标识符?您的tableview==yourtableviewName,因此这是名称=mainList@IBOutlet var mainList:UITableView!仍然不起作用