更新UIImageView而不重新加载所有数据

时间:2018-11-30 05:36:08

标签: ios iphone swift

我已经在这个问题上停留了几天。我将图像视图设置为不可见,直到触发长按手势为止。但是,我无法确定如何使UIImageView在此之后变得可见。这在tableView的Cell中。我使用过reloadData(),但是问题是表格失去了位置。松开手指时它会向上滚动。长手势将触发数据库侧的布尔值,从而切换saveShow。加载数据后,查询将检查并显示UIImageView(如果为true)。所以我相信我将不得不重新加载数据,因为它基于查询。任何帮助将不胜感激!

class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIPickerViewDelegate, UIPickerViewDataSource {

    let db = DatabaseController()

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var cityPicker: UIPickerView!

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        cityPicker.delegate = self
        cityPicker.dataSource = self

        self.tableView.autoresizingMask = UIView.AutoresizingMask.flexibleHeight;
        self.db.createTable()

        //////////////////////////////////////////////////////////////////
        let longPressGesture:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPress))
        longPressGesture.minimumPressDuration = 1.0 // 1 second press
        longPressGesture.delegate = self as? UIGestureRecognizerDelegate
        self.tableView.addGestureRecognizer(longPressGesture)
        ////////////////////////////////////////////////////////////////


        ////////////////////////////////////////////////////
        Alamofire.request("http://url.com/jsonfile").responseJSON { response in
            if (response.result.value != nil) {
                let strOutput = JSON(response.result.value ?? "nil")

                if let resObj = strOutput.arrayObject {
                    arrRes2 = resObj as! [[String:AnyObject]]
                    self.db.addShowsToDatabase(arrRes: arrRes2)
                }
            }

            self.db.deleteOldShows()
            self.grabData(id: 1)
            self.tableView.reloadData()
        }
        ////////////////////////////////////////////////////////////////////
    }

    func grabData(id: Int) -> Void {
        regionResults = self.db.listAllShows(id: id)
        self.tableView.reloadData()
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return cities.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return cities[row]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        cheapFix = row + 1
        grabData(id: row + 1)
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if regionResults.isEmpty {
            return 1
        } else {
            return regionResults.count
        }
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "bandCustomCell") as! BandTableViewCell
        if regionResults.isEmpty {
            cell.bandPic.image = UIImage(named: "flyer.jpg")
            cell.bandSummary?.text = "No Shows Announced!"
            cell.bandVenue?.text = "None"
            cell.bandDate?.text = "None"
        } else {
            let show = regionResults[indexPath.row]
            //print(try! show.get(Expression<String>("show_summary")))

            let strDateFull = try! show.get(Expression<String>("show_date"))
            var strDate: Array = ((strDateFull as AnyObject).components(separatedBy: "T"))

            // Setting up the date
            var dateArr: Array = strDate[0].components(separatedBy: "-")
            let dateStr: String = "\(dateArr[1])-\(dateArr[2])-\(dateArr[0])"

            // Setting up the time
            var timeArr: Array = strDate[1].components(separatedBy: ":")
            var timeStr: Int? = Int(timeArr[0])

            // Changing military time to standard
            if timeStr! > 12 {
                timeStr = timeStr! - 12
            }
            let saved = try! show.get(Expression<Bool>("save_show"))

            if (saved == true) {
                cell.bandSavedShow.isHidden = false
            } else if (saved == false) {
                cell.bandSavedShow.isHidden = true
            }

            cell.bandSummary?.text = "\(try! show.get(Expression<String>("show_summary"))), \(timeStr!):\(timeArr[1])PM"
            cell.bandVenue?.text = try! show.get(Expression<String>("venue_name"))
            /*if (show["shows_img"] as? String != "null") {
                let url = URL(string: show["shows_img"] as! String)
                cell.bandPic.kf.setImage(with: url)
            } else {*/
            cell.bandPic.image = UIImage(named: "flyer.jpg")
            //}
            cell.bandDate?.text = dateStr

            tableView.isScrollEnabled = true

        }
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        myIndex2 = indexPath.row
        //performSegue(withIdentifier: "segue2", sender: self)
    }

    @objc func longPress(_ longPressGestureRecognizer: UILongPressGestureRecognizer) {
        if longPressGestureRecognizer.state == UIGestureRecognizer.State.began {
            let touchPoint = longPressGestureRecognizer.location(in: self.tableView)
            if let indexPath = self.tableView.indexPathForRow(at: touchPoint) {

                let show = regionResults[indexPath.row]
                let summary = try! show.get(Expression<String>("show_summary"))
                let date = try! show.get(Expression<String>("show_date"))
                let saved = try! show.get(Expression<Bool>("save_show"))

                self.db.toogleSaveShows(summary: summary, date: date, saved: saved)
                reload(tableView: self.tableView, indexPath: indexPath)
            }
            //grabData(id: cheapFix)

        }
    }

    func reload(tableView: UITableView, indexPath: IndexPath) {
        //found on stackoverflow
        let contentOffset = tableView.contentOffset
        tableView.beginUpdates()
        tableView.reloadRows(at: [indexPath], with: UITableView.RowAnimation.none)
        tableView.setContentOffset(contentOffset, animated: false)
        tableView.endUpdates()
    }
}

2 个答案:

答案 0 :(得分:2)

如下更新longPressGesture方法:

let touchPoint = longPressGestureRecognizer.location(in: self.tableView)
        if let indexPath = self.tableView.indexPathForRow(at: touchPoint) {
              let cell = tableView.cellForRow(at: indexPath) as? BandTableViewCell;
              cell.bandPic.image = ....//provide image here.
        }

在这里,不需要重新加载整个表,只需访问单元格并在其中设置imageview。

答案 1 :(得分:0)

首先,必须在要使用的单元格上添加手势识别器,而不是在整个表视图上添加手势识别器,就像在尝试获取要按下的单元格的索引路径的手势选择器方法中一样。

然后尝试使用找到的索引路径重新加载单元格。

    self.tableView.reloadRows(at: [indexpath], with: .automatic)