致命错误:数组索引超出范围。刷新时快速移动

时间:2016-02-13 07:25:20

标签: swift tableview fatal-error uisegmentedcontrol uirefreshcontrol

多次尝试找出导致致命错误的原因。但是,仍然无法弄明白。当我尝试使用pull刷新表时,第一个表(结果表)会导致此错误。第二个表(favoriteProductTableView)工作得很完美,所以我没有提供关于第二个表的任何代码。想知道为什么。谢谢你的帮助。

    var followArray = [String]()
    var resultsNameArray = [String]()
    var resultsImageFiles = [PFFile?]()
    var resultsDetailsArray = [String]()
    var resultsDetailsImageFiles = [PFFile?]()
    var resultsObjectID = [String]()
    var resultsTitle = [String]()
    var personPriceArray = [String]()
    var personQuantityArray = [String]()
    var personOrderTypeArray = [String]()

    var refresher:UIRefreshControl!

    override func viewDidLoad() {
        super.viewDidLoad()
        favoriteProductTableView.hidden = true
        refresher = UIRefreshControl()
        refresher.tintColor = UIColor.blackColor()
        refresher.addTarget(self, action: "refresh", forControlEvents: UIControlEvents.ValueChanged)
        self.resultsTable.addSubview(refresher)
    }

    override func viewDidAppear(animated: Bool) {
        refreshResults()
    }

    func refresh(){
        refreshResults()
    }

    func refreshResults(){
        switch(segmentedControl.selectedSegmentIndex){
        case 0:
            followArray.removeAll(keepCapacity: false)
            resultsNameArray.removeAll(keepCapacity: false)
            resultsImageFiles.removeAll(keepCapacity: false)
            resultsDetailsArray.removeAll(keepCapacity: false)
            resultsDetailsImageFiles.removeAll(keepCapacity: false)
            resultsObjectID.removeAll(keepCapacity: false)
            resultsTitle.removeAll(keepCapacity: false)
            personPriceArray.removeAll(keepCapacity: false)
            personQuantityArray.removeAll(keepCapacity: false)
            personOrderTypeArray.removeAll(keepCapacity: false)

            let followQuery = PFQuery(className: "follow")
            followQuery.whereKey("user", equalTo: (PFUser.currentUser()!.username)!)
            followQuery.whereKey("userToFollow", notEqualTo: (PFUser.currentUser()!.username)!)

            followQuery.findObjectsInBackgroundWithBlock { (objects:[PFObject]?, error: NSError?) -> Void in
                if error != nil {
                }
                for object in objects! {
                    self.followArray.append(object.objectForKey("userToFollow") as! String)
                }
                let query = PFQuery(className: "products")
                query.whereKey("userName", containedIn: self.followArray)

                query.findObjectsInBackgroundWithBlock { (catchobjects:[PFObject]?, error:NSError?) -> Void in
                    if error != nil {
                    }
                    for catchobject in catchobjects! {
                        if catchobject.objectForKey("selling_price") != nil {
                            self.personPriceArray.append(catchobject.objectForKey("selling_price") as! String)
                            self.personOrderTypeArray.append("Selling")
                        } else {
                            self.personPriceArray.append(catchobject.objectForKey("buying_price") as! String)
                            self.personOrderTypeArray.append("Buying")
                        }
                        self.personQuantityArray.append(catchobject.objectForKey("quantity") as! String)
                        self.resultsNameArray.append(catchobject.objectForKey("unique_username") as! String)
                        self.resultsImageFiles.append(catchobject.objectForKey("profile_picture") as? PFFile)
                        self.resultsDetailsArray.append(catchobject.objectForKey("details") as! String)
                        self.resultsDetailsImageFiles.append(catchobject.objectForKey("detailsImage") as? PFFile)
                        self.resultsTitle.append(catchobject.objectForKey("title") as! String)
                        self.resultsObjectID.append(catchobject.objectId!)
                    }
                    dispatch_async(dispatch_get_main_queue()) {
                        self.resultsTable.reloadData()
                    }
                    self.loadEmptyLabel(self.resultsTable)
                }
                self.refresher.endRefreshing()
            }
            break
        case 1:
            ...
            break
        default:
            break
        }
    }

    func loadEmptyLabel(tableView: UITableView) {
        let emptyLabel = UILabel(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height))
        emptyLabel.textAlignment = NSTextAlignment.Center
        emptyLabel.textColor = UIColor.blackColor()
        emptyLabel.text = "No matched result found."
        tableView.backgroundView = emptyLabel
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        var resultCount = Int()
        if tableView == resultsTable {
            resultCount = resultsNameArray.count
        } else {
            resultCount = resultsTitleArray.count
        }
        if resultCount == 0 {
            tableView.reloadData()
            emptyLabel.hidden = false
        } else {
            emptyLabel.hidden = true
        }
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        var numRow: Int = 0
        switch(segmentedControl.selectedSegmentIndex){
        case 0:
            numRow = resultsNameArray.count
            break
        case 1:
            numRow = resultsTitleArray.count
            break
        default:
            break
        }
        return numRow
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        if tableView == resultsTable {
            let cell:favoritedTableViewCell = resultsTable.dequeueReusableCellWithIdentifier("Cell") as! favoritedTableViewCell
            cell.profileLbl.text = self.resultsNameArray[indexPath.row]
            cell.messageTxt.text = self.resultsDetailsArray[indexPath.row]
            cell.priceLabel.text = "\(self.personOrderTypeArray[indexPath.row]) \(self.personQuantityArray[indexPath.row]) for $\(self.personPriceArray[indexPath.row])"
            cell.titleLabel.text = self.resultsTitle[indexPath.row]
            if resultsImageFiles[indexPath.row] != nil {
                resultsImageFiles[indexPath.row]!.getDataInBackgroundWithBlock { (imageData:NSData?, error:NSError?) -> Void in
                    if error == nil{
                        let image = UIImage(data: imageData!)
                        cell.imgView.image = image
                    }
                }
            } else {
                cell.imgView.image = UIImage(named: "Profile Picture")
            }
            if resultsDetailsImageFiles[indexPath.row] != nil{
                resultsDetailsImageFiles[indexPath.row]?.getDataInBackgroundWithBlock({ (imageData:NSData?, error:NSError?) -> Void in
                    if error == nil{
                        let image = UIImage(data: imageData!)
                        cell.detailsImg.image = image
                    }
                })
            } else {
                cell.detailsImg.image = UIImage(named: "Profile Picture")
            }
            return cell
        } else {
        ....
        }
    }

1 个答案:

答案 0 :(得分:1)

您的numberOfRowsInSection函数会根据segmentedControl.selectedSegmentIndex返回两个数组长度中的一个,而cellForRowAtIndexPath会根据显示的tableView对数组进行索引。这看起来并不正确,特别是考虑到你的引用“它似乎没有在任何地方填充 - 如果它只是resultsTitle?”。

此外,您正在从后台线程中调用self.resultsTable.reloadData()。这很糟糕 - 必须使用以下命令从主线程调用:

dispatch_async(dispatch_get_main_queue()) {
    self.resultsTable.reloadData()
}

尽管如此,我们还不清楚你为什么在循环中得到这个。