2016-04-13 4 views
0

私はJsonの詳細要素でビューをコーディングしようとしています。しかし、コンパイラはSegueのための準備でクラッシュします。Json - 詳細ビューへの分割の準備

@IBOutlet weak var menuButton:UIBarButtonItem! 

let yourJsonFormat: String = "JSONFile" // set text JSONFile : json data from file 
             // set text JSONUrl : json data from web url 

var arrDict :NSMutableArray=[] 

// @IBOutlet weak var eventCalendar:UITableView!

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    if self.revealViewController() != nil { 
     menuButton.target = self.revealViewController() 
     menuButton.action = "revealToggle:" 
     self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer()) 
    } 

    if yourJsonFormat == "JSONFile" { 
     jsonParsingFromFile() 
    } else { 
     jsonParsingFromURL() 
    } 
} 


func jsonParsingFromURL() { 

    let url = NSURL(string: "http://theappguruz.in//Apps/iOS/Temp/json.php") 
    let request = NSURLRequest(URL: url!) 

    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in 
     self.startParsing(data!) 
    } 
} 


func jsonParsingFromFile() 
{ 
    let path: NSString = NSBundle.mainBundle().pathForResource("days", ofType: "json")! 
    let data : NSData = try! NSData(contentsOfFile: path as String, options: NSDataReadingOptions.DataReadingMapped) 

    self.startParsing(data) 
} 

func startParsing(data :NSData) 
{ 
    let dict: NSDictionary!=(try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)) as! NSDictionary 

    for var i = 0 ; i < (dict.valueForKey("objects") as! NSArray).count ; i++ { 
     arrDict.addObject((dict.valueForKey("objects") as! NSArray) .objectAtIndex(i)) 
    } 
} 

// eventCalendar .reloadData()

override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
{ 
    return 1 
} 


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    return arrDict.count 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    let cellIdentifier = "Cell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! TableViewCell 

    let strName : NSString=arrDict[indexPath.row] .valueForKey("name") as! NSString 
    let strSubtitle : NSString=arrDict[indexPath.row] .valueForKey("subtitle") as! NSString 
    let strLocation : NSString=arrDict[indexPath.row] .valueForKey("location") as! NSString 
    let strStart : NSString=arrDict[indexPath.row] .valueForKey("start") as! NSString 

    if let strImage = arrDict[indexPath.row] .valueForKey("image") as? String { 

     if let data = NSData(contentsOfURL: NSURL(string:strImage)!) { 
      cell.lbImage.image = UIImage(data: data) 
     } 
    } 

    cell.lbName.text=strName as String 
    cell.lbSubtitle.text=strSubtitle as String 
    cell.lbStart.text=strStart as String 
    cell.lbLocation.text=strLocation as String 

    return cell as TableViewCell 
} 


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    var detailView = segue.destinationViewController as! EventDetail 

    if segue.identifier == EventDetail.identifier() { 

     if let indexPath = self.tableView.indexPathForSelectedRow { 
      let selectedRow = indexPath.row 
      let selected = self.arrDict[selectedRow] 
      let vc = segue.destinationViewController as! EventDetail 
      vc.ARRDICT = selected as! NSMutableArray 
     } 
    } 
} 

、エラーメッセージです:

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'

+1

ため

let arrayObjects = dict.valueForKey("objects") as! NSArray for eachDict in arrayObjects { let dict = eachDict as! NSDictionary arrDict.addObject(dict) } 

完全なコードを追加してください。たとえば、 'arrDict'の構造体です。送信者に情報を送信してみませんか? – jose920405

+0

私はコードを入れて...なぜあなたは送信者が良いと思いますか?ありがとうございました。 – user3623737

+0

storyboardに 'showEventDetail' segue識別子を追加しましたか?そうでない場合は、ストーリーボードを開き、segueを見つけて 'showEventDetail' idで識別します。 –

答えて

0

だけのテストのためにあなたはストーリーボードで自動セグエを削除し、手動セグエを追加する必要があります(タイプショー)、識別子を使用して、の中でself.performSegueWithIdentifier("yourIdentifier", sender: sender)を呼び出すと、このインデックスパスを使用して配列内の位置を取得し、そのオブジェクトを送信しようとしますctを送信側パラメータとしてその位置に格納します。 prepareForSegueで入手してください。

ループをstartParsingに変更してください。より良いlevel of complexity

関連する問題