Swift Table索引超出范围

时间:2016-08-22 15:10:47

标签: swift

我是swift的新手,并且已经设置了一个使用sql数据库中的数据填充的表。

表格加载正常,但偶尔会出错:

  

“致命错误:索引超出范围”。

它不会一直发生。

此外,我已经从解析迁移到使用sql和http请求。在将数据填充到表中时,我是否采用了正确的方法?

非常感谢任何帮助!

    @IBOutlet var tableView: UITableView!


    var tableData = [String]()
    var tableImages = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()


          }



    override func viewDidAppear(animated: Bool) {

        if Reachability.isConnectedToNetwork() == true {

        self.tableView.hidden = true

          self.tableData.removeAll(keepCapacity: true)
        self.tableImages.removeAll(keepCapacity: true)

        var nib = UINib(nibName: "vwTblCell3", bundle: nil)
        tableView.registerNib(nib, forCellReuseIdentifier: "cell3")


        let request = NSURLRequest(URL: NSURL(string: "********.php")!)


        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{
            (response: NSURLResponse?, data: NSData?, error: NSError?)-> Void in


            let str2 = String(data: data!, encoding: NSUTF8StringEncoding)



            let str3 = Int(str2!)!





            let url = NSURL(string: "********")!

            let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in

                if let urlContent = data {



                    do {

                        let jsonResult = try NSJSONSerialization.JSONObjectWithData(urlContent, options: NSJSONReadingOptions.MutableContainers)


                        print(str3)

                        var i = 0

                        while i < str3 {

                        print(jsonResult[i]["title"]! as! String)
                            print(jsonResult[i]["image"]! as! String)

                            self.tableData.append(jsonResult[i]["title"]! as! String)
                            self.tableImages.append(jsonResult[i]["image"]! as! String)

                            i = i + 1

                            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                                self.tableView.reloadData()
                            })

                        }

                    } catch {

                        print("JSON serialization failed")

                    }


                }


            }

            task.resume()




             });


            print(tableData)


          self.tableView.hidden = false


        }

    }


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




        return self.tableData.count
    }


    // 3
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell     {
        let cell: TblCell3 = self.tableView.dequeueReusableCellWithIdentifier("cell3") as! TblCell3
        cell.lblAffiliate.text = tableData[indexPath.row]


        let url3 = NSURL(string: "https://www.********.co.uk/\(tableImages[(indexPath as NSIndexPath).row]).png")
        cell.affiliateImage.sd_setImageWithURL(url3)


        return cell
    }

    // 4
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("Row \(indexPath.row) selected")
    }

    // 5
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 400
    }





}

2 个答案:

答案 0 :(得分:1)

问题是,您对"small"的调用是在"big"循环中进行的reloadData()while。在tableData循环之后移动它,此时两个阵列都将完全填充。

答案 1 :(得分:1)

我希望这会有所帮助。为了更好的代码我改变了几个小东西(一半可以被认为是偏见)。我认为问题主要是你在循环中重新加载tableView。其他一切只是处理这种情况的一种更好的方法。我把所有东西放在viewDidLoad中,并使tableView加载空输入前传接收数据。我认为这是处理这种情况的更标准。如果您需要任何其他帮助,请告诉我们。

class ViewController: UIViewController {

    @IBOutlet var tableView: UITableView!

    var tableData: [String] = []
    var tableImages: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        if Reachability.isConnectedToNetwork() == true {
            var nib = UINib(nibName: "vwTblCell3", bundle: nil)
            tableView.registerNib(nib, forCellReuseIdentifier: "cell3")

            let request = NSURLRequest(URL: NSURL(string: "********.php")!)

            NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{
                (response: NSURLResponse?, data: NSData?, error: NSError?)-> Void in

                let str2 = String(data: data!, encoding: NSUTF8StringEncoding)
                let str3 = Int(str2!)!
                let url = NSURL(string: "********")!

                let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in
                    if let urlContent = data {
                        do {
                            let jsonResult = try NSJSONSerialization.JSONObjectWithData(urlContent, options: NSJSONReadingOptions.MutableContainers)
                            self.tableData = []
                            self.tableImages = []  
                            for i in 0..<str3 {
                                self.tableData.append(jsonResult[i]["title"]! as! String)
                                self.tableImages.append(jsonResult[i]["image"]! as! String)
                            }

                            dispatch_async(dispatch_get_main_queue()) {
                                    self.tableView.reloadData()
                            }
                        } catch {
                            print("JSON serialization failed")
                        }
                    }
                }
                task.resume()
            });
        }
    }

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

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell     {
        let cell: TblCell3 = self.tableView.dequeueReusableCellWithIdentifier("cell3") as! TblCell3
        cell.lblAffiliate.text = tableData[indexPath.row]


        let url3 = NSURL(string: "https://www.********.co.uk/\(tableImages[(indexPath as NSIndexPath).row]).png")
        cell.affiliateImage.sd_setImageWithURL(url3)

        return cell
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("Row \(indexPath.row) selected")
    }

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 400
    }
}