2015-12-07 3 views
0

Я использую массив для чтения данных из базы данных. В настоящее время у меня есть 8 элементов в массиве. Я пытаюсь сделать таблицу, где у меня заголовок раздела. В настоящее время у меня есть 4 раздела, и я правильно их установил, и он работает. Он также работает в первый раз, но когда я пытаюсь прокрутить назад, я получаю индекс вне диапазона. Я использую myarray [myindex], чтобы установить данные ячейки для каждого элемента, и это не работает.Вид таблицы из индекса массива вне диапазона

Кажется, что мне нужно разбить свои данные на 4 раздела, которые содержат только данные для каждого раздела, чтобы позволить ему правильно управлять таблицей. Данные могут содержать любое количество разделов.

Есть ли лучший способ сделать это?

Я приложил pic для описания проблемы.

Screen shot of table

Благодаря

Добавление кода по запросу.

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    print("Returning Sections - > \(sections)") 
    return sections //seems to work 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 
    print("Return number of rows in section -> \(noRowsInSection[section])") 
    return noRowsInSection[section] // seems to work 
} 
override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    return sectionHeader[section] // seems to work 
} 
override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { 
    // Format for section Headers 
    let header:UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView 
    header.textLabel!.textColor = UIColor.blueColor() 
    UIColor.blueColor() 
    header.textLabel!.font = UIFont.boldSystemFontOfSize(12) 
    header.textLabel!.frame = header.frame 
    header.textLabel!.textAlignment = NSTextAlignment.Right 
} 
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("OurCell", forIndexPath: indexPath) as! OurTableViewCell 
    print("myindex - > \(myindex) row -> \(indexPath.row)") 
    cell.OurCellLabel.text = MyHouses[myindex].getAddressDetails()  // End configure houses.cell 
    //cell.OurCellLabel.text = MyHouses[indexPath.row].getAddressDetails()  // End configure houses.cell 
    myindex++ // PROBLEM HERE - GOES OUT OF RANGE 
    return cell 
} 

Здесь я получаю данные из БД SQLite

func GetListOfHousesFromDB() { 
    let docsDir = dirPaths[0] 
    let databasePath = docsDir.stringByAppendingString("/newdb.db") 
    if fileMgr.fileExistsAtPath(databasePath as String) { 
     let houseDB = FMDatabase(path: databasePath as String) 
     if houseDB.open() { 
      var noRows: Int = 0 
      var sql = "select count(Address) as cnt from Houses" // Define Query 
      houseDB.executeStatements(sql) // Execute Query 
      let results:FMResultSet? = houseDB.executeQuery(sql,withArgumentsInArray: nil) //Get results from Query 
      if results?.next() == true { 
       let cnt = (results?.stringForColumn("cnt"))! // Retrieve number of rows from DB 
       noRows = Int(cnt)! 
      } 
      var i = 0 
      sql = "SELECT Address, Street, City, State, Zip from Houses ORDER BY State, City, Street, Address" // Define Query 
      houseDB.executeStatements(sql) // Execute Query 
      let results2:FMResultSet? = houseDB.executeQuery(sql,withArgumentsInArray: nil) // Get results from Query 
      while results2?.next() == true { 
       MyHouses.append(newhouse()) 
       MyHouses[i].address = (results2?.stringForColumn("Address"))! 
       MyHouses[i].street = (results2?.stringForColumn("Street"))! 
       MyHouses[i].city = (results2?.stringForColumn("City"))! 
       MyHouses[i].state = (results2?.stringForColumn("State"))! 
       MyHouses[i].zip = (results2?.stringForColumn("Zip"))! 
       print("Address -> \(i) \(MyHouses[i].getAddressDetails())") 
       i++ 
      } 
     } 
     houseDB.close() 
    } 
} 
+2

Покажите нам некоторый соответствующий код, особенно 'cellForRowAtIndexPath',' 'numberOfRowsInSection' и методы numberOfSectionsInTableview' – spassas

ответ

0

Основываясь на других post, что вам нужно, это обновленная модель House и обновлена ​​структура данных для обработки данных для представления таблицы.

House - класс модели

struct House { 
    var address: String 
    var street: String 
    var city: String 
    var state: String 
    var zip: String 

    func getAddressDetails() -> String { 
     return "\(address) \(street) \(city) \(state) \(zip)" 
    } 

    func getCityState() -> String { 
     return "\(city) - \(state)" 
    } 
} 

Вспомогательный класс для загрузки данных

class HouseDataHelper { 

    private static let _sharedInstance = HouseDataHelper() 
    var myHouses: Dictionary<String, [House]> = [:] 

    private init() { 
     loadHouseData() 
    } 

    static func sharedInstance() -> HouseDataHelper { 
     return _sharedInstance 
    } 

    private func loadHouseData() { 
     var houses = [House]() 

     //Populating your actual values here. GetListOfHousesFromDB() 

     //Loading dummy data for testing 
     var sectionHeader = "" 
     for i in 0...4 { 
      sectionHeader = "Header \(i)" 
      houses += [House(address: "Address1", street: "Street1", city: "City1", state: "State1", zip: "Zip1")] 
      houses += [House(address: "Address2", street: "Street2", city: "City2", state: "State2", zip: "Zip2")] 
      houses += [House(address: "Address3", street: "Street3", city: "City3", state: "State3", zip: "Zip3")] 
      houses += [House(address: "Address4", street: "Street4", city: "City4", state: "State4", zip: "Zip4")] 
      houses += [House(address: "Address5", street: "Street5", city: "City5", state: "State5", zip: "Zip5")] 

      myHouses.updateValue(houses, forKey: sectionHeader) 
      houses = [] 
     } 
    } 
} 

Table View Controller

class TableViewController: UITableViewController { 

    var houses = HouseDataHelper.sharedInstance().myHouses 
    var sectionHeaders: [String] = [] 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 

     sectionHeaders = Array(houses.keys.sort()) 
    } 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return houses.count 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if let rows = houses[sectionHeaders[section]] { 
      return rows.count 
     } 

     return 0 
    } 

    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
     return sectionHeaders[section] 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     //Populate cells based on "houses" 
    } 
} 
+0

Я дам это попробовать, несколько вещей, которые я не очень понимаю, но если увидим Я могу заставить его работать ..... спасибо! – Grumpy

+0

В итоге я использовал многомерный массив [section] [row]. Работает. – Grumpy

Смежные вопросы