簡體   English   中英

數組索引的表視圖超出范圍

[英]Table view from array index out of range

我正在使用數組從數據庫中讀取數據,當前數組中有8個項目。 我正在嘗試制作一個有節標題的表。 目前,我有4個部分,並且已經正確設置了它並且可以正常工作。 它也可以在第一次運行時運行,但是當我嘗試向后滾動時,索引會超出范圍。 我正在使用myarray [myindex]設置每個項目的單元格數據,但無法正常工作。

看來我需要將數據分為4個部分,每個部分僅包含數據,以使表視圖能夠對其進行適當控制。 數據可以包含任意數量的節。

有一個更好的方法嗎?

我附上一張圖片來描述問題。

表的屏幕截圖

謝謝

根據要求添加代碼。

  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()
    }
}

根據您的其他文章 ,您需要的是更新的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 = []
        }
    }
}

表格視圖控制器

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM