Json - подготовиться к переходу к подробному просмотру

Я пытаюсь кодировать представление с элементами детали из 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 слабый 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
        }
    }
}

И сообщение об ошибке:

Завершение работы приложения из-за неперехваченного исключения "NSRangeException", причина: "*** -[__NSArrayM objectAtIndex:]: индекс 0 выходит за границы для пустого массива"

1 ответ

Только для тестирования вы должны удалить автоматический переход в раскадровке и добавить ручной переход (тип show), используя идентификатор и вызов self.performSegueWithIdentifier("yourIdentifier", sender: sender) в didSelectRowAtIndexPath этот метод имеет indexPath используйте этот indexpath для получения позиции в массиве и попробуйте отправить этот объект в эту позицию в качестве параметра отправителя. И получить это в prepareForSegue,

Пожалуйста, измените ваш startParsing цикл до.

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

к лучшему level of complexity

Другие вопросы по тегам