0

多くのデータを含むマルチアップ テーブルを返すアプリを作成しようとしていますが、ここに完了ハンドラーが必要だと思います。

// 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]

私が間違っていることは何ですか?

4

1 に答える 1

0

パーツの問題を修正しましょう。

最初のエラー:

アップルによると:

クラスと構造体は、そのクラスまたは構造体のインスタンスが作成されるまでに、格納されているすべてのプロパティを適切な初期値に設定する必要があります。格納されたプロパティを不確定な状態のままにすることはできません。

格納されたプロパティの初期値は、初期化子内で設定するか、プロパティの定義の一部として既定のプロパティ値を割り当てることによって設定できます。

から継承するinitクラスでデフォルトのメソッドを使用しようとしています。演算子を使用して、オブジェクトが実行時に値を持つことをコンパイラに明示的に伝えることはお勧めしません。したがって、問題を解決する1つのオプションは、次のように初期化子を使用することです:RepoSwiftyJSONNSObject!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マークします。convenienceinit(userid:String , title:String)init

最初のエラーを解決するには多くの方法があります。上記は 1 つにすぎません。

2 番目のエラー:

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"
  }
]

これがお役に立てば幸いです。

于 2016-01-27T21:06:08.760 に答える