我试图创建一个返回包含大量数据的Multi-up表的应用程序,但我想我需要一个完成处理程序。
// object data :
import Foundation
class RepoSwiftyJSON:NSObject {
let _userId:String!
let _title:String!
init(userid:String , title:String){
self._userId = userid
self._title = title
}
}
TableViewController
import UIKit
import Alamofire
import SwiftyJSON
class TableViewController: UITableViewController {
var parkData:[JSON] = []
var aryId = [RepoSwiftyJSON]()
func getJSONData() {
let url = "http://jsonplaceholder.typicode.com/posts/"
Alamofire.request(.GET,url).responseJSON {response in
guard let data = response.result.value else {
let error = response.result.error
let alertController = UIAlertController(title: "Error", message:error?.localizedDescription, preferredStyle: .Alert)
let okAction = UIAlertAction(title: "Retry", style: .Default, handler: { (alert:UIAlertAction) -> Void in
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
self.getJSONData()
alertController.dismissViewControllerAnimated(true, completion: {})
})
alertController.addAction(okAction)
self.presentViewController(alertController, animated: true, completion: {})
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
return
}
let json = JSON(data)
self.parkData = json.array!
for key in self.parkData{
let DataArray:RepoSwiftyJSON = RepoSwiftyJSON ()
let userId = key["userId"].intValue
let title = key["title"].string
DataArray._userId = userId
DataArray._title = title
self.aryId.append(DataArray)
}
self.showJSONData()
}
}
func showJSONData() {
//println(parkData)
tableView.reloadData()
}
override func viewDidLoad() {
super.viewDidLoad()
getJSONData()
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let numberOfRows: Int = self.aryId.count {
return numberOfRows
} else {
return 0
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("masterCell", forIndexPath: indexPath)
let rowData:JSON = aryId[indexPath.row]
cell.textLabel?.text = rowData._title
cell.detailTextLabel?.text = String(rowData._userId)
print(rowData)
return cell
}
但是当我运行应用程序时,我收到以下错误:
Missing argument for parameter 'userid'
在热线电话专线let DataArray:RepoSwiftyJSON = RepoSwiftyJSON ()
和
Cannot subscript a value of type '[RepoSwiftyJSON]'
在let rowData:JSON = aryId[indexPath.row]
行
我做错了什么?
答案 0 :(得分:0)
让我们解决部分问题:
第一次错误:
根据Apple的说法:
在创建该类或结构的实例时,类和结构必须将其所有存储属性设置为适当的初始值。存储的属性不能保留在不确定的状态。
您可以在初始化程序中设置存储属性的初始值,或者通过将默认属性值指定为属性定义的一部分。
您尝试使用继承自init
的类RepoSwiftyJSON
中的默认NSObject
方法,建议您不要使用!
运算符明确说明编译器,该对象在运行时将具有值。因此,解决问题的一个方法是使用convenience
初始化程序,如下所示:
class RepoSwiftyJSON: NSObject {
let _userId: String
let _title: String
init(userid:String , title:String){
self._userId = userid
self._title = title
}
override convenience init() {
self.init(userid: "a", title: "b")
}
}
let DataArray: RepoSwiftyJSON = RepoSwiftyJSON()
DataArray._title // a
DataArray._userId // b
通过上述方式,您覆盖类init
的默认NSObject
并将其标记为convenience
以允许调用另一个init(userid:String , title:String)
在默认的init
方法中。
有很多方法可以解决你的第一个错误,上面只有一个。
第二次错误:
如果我们在他的定义中检查变量aryId
:
var aryId = [RepoSwiftyJSON]()
这是一个RepoSwiftyJSON
的数组,在您的后续行中:
let rowData: JSON = aryId[indexPath.row]
您尝试将上述行返回的RepoSwiftyJSON
类型的元素分配给另一个JSON
类型的元素,但这不正确。
修改强>
您可以使用以下函数创建JSON:
let jsonObject: [AnyObject] = [
["name": "John", "age": 21],
["name": "Bob", "age": 35],
]
func createJSON(value: AnyObject) -> String {
let options = NSJSONWritingOptions.PrettyPrinted
guard NSJSONSerialization.isValidJSONObject(value) else {
return ""
}
do {
let data = try NSJSONSerialization.dataWithJSONObject(value, options: options)
if let string = NSString(data: data, encoding: NSUTF8StringEncoding) {
return string as String
}
} catch let error {
print("\(error)")
}
return ""
}
let json = createJSON(jsonObject)
你会看到:
[
{
"age" : 21,
"name" : "John"
},
{
"age" : 35,
"name" : "Bob"
}
]
我希望这对你有所帮助。