2016-03-14 3 views
0

Я пытаюсь реализовать TableView как Instagram с одной строкой в ​​каждом разделе.Заполнение массива для секции tableView и ячейки tableView, swift

Я хотел бы, чтобы заполнить два массива:

первого sectionArray, чтобы получить данные строки в зависимости от секции

и объект, чтобы получить имя раздела.

Но когда я пытаюсь заполнить sectionArray, я получаю сообщение об ошибке: «Фатальная ошибка: индекс массива вне диапазона»

У вас есть представление о том, как это исправить ??

Спасибо!

import UIKit 
    import ParseUI 
    import Parse 

    class TableView: UIViewController, UITableViewDelegate, UITableViewDataSource, CLLocationManagerDelegate { 


     @IBOutlet weak var tableView : UITableView? 


     var sectionArray : [[PFFile]] = [] 


     override func viewDidLoad() { 
      super.viewDidLoad() 

      self.loadCollectionViewData() 

     } 


     var object = [PFObject]() 

     func loadCollectionViewData() { 

      let query = PFQuery(className: "Myclass") 

      // Fetch data from the parse platform 
      query.findObjectsInBackgroundWithBlock { 
       (objects: [PFObject]?, error: NSError?) -> Void in 

       // The find succeeded now rocess the found objects into the countries array 
       if error == nil { 

        // Clear existing country data 
        self.object.removeAll(keepCapacity: true) 

        // Add country objects to our array 
        if let objects = objects as [PFObject]? { 
         self.object = Array(objects.generate()) 

         let index = self.object.count as Int 
         print (index) 

         for i in 1...index { 
          //error here! 
          if let finalImage = self.object[i]["image"] as? [PFFile] 
          { 
           self.sectionArray[i] = finalImage 

           print(self.sectionArray[i]) 
          } 

         } 
        } 

        // reload our data into the collection view 
        self.tableView?.reloadData() 

       } else { 
        // Log details of the failure 
        print("Error: \(error!) ") 
       } 
      } 
     } 

     func numberOfSectionsInTableView(tableView: UITableView) -> Int { 

      return sectionArray.count 
     } 

     func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 


      return sectionArray[section].count 

     } 

     func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
      if section < self.object.count { 
       if let namelabel = object[section]["Name"] as? String { 
        return namelabel 
       } 
      } 

      return nil 
     } 

     func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
      return 30 
     } 


     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

      var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! ListControllerViewCell! 
      if cell == nil 
      { 
       cell = ListControllerViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell") 
      } 

      if let finalImage = sectionArray[indexPath.section][indexPath.row] as? PFFile //object[indexPath.row]["image"] as? PFFile 
      { 

       finalImage.getDataInBackgroundWithBlock{(imageData: NSData?, error: NSError?) -> Void in 
        if error == nil 
        { 
         if let imageData = imageData 
          { 
           cell.ImagePromo!.image = UIImage(data:imageData) 
          } 

        } 

      } 


      if let CommentLabel = sectionArray[indexPath.section][indexPath.row] 
      //object[indexPath.row]["Comment"] as? String 
      { 
       cell.CommentLabel!.text = CommentLabel 
       cell.CommentLabel!.adjustsFontSizeToFitWidth = true 
      } 

      return cell; 
     } 

    } 

ответ

1

У вас есть проблемы в вашем для в цикле:

Вы должны начать с 0, а не 1, чтобы ваш вызов цикла выглядит следующим образом:

for i in 0..<index 

Это «опасность» с петлями for-in по сравнению с петлями типа C. Вы зацикливаете правильное количество раз, но размер вашего массива превышает 1, потому что вы начинаете с неправильного индекса.

0

Попробуйте добавить Exception Breakpoint, чтобы поймать место ошибки в точности,

также редактировать как источник данных,

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 

     if(sectionArray.count != 0) { 
     return sectionArray.count 
     } else { 
     return 0; 
     } 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     if(sectionArray.count < section) { 
      return sectionArray[section].count 
     } else { 
      return 0; 
     }  
}