繁体   English   中英

切换数据源后,不再检测到TableViewCell长按

[英]TableViewCell Long press no longer detected after switching datasource swift

因此,我很好奇为什么更改数据源会禁止快速按下长按。 我目前正在使用XCode 8版本5。我尚未找到可能引起问题的解决方案。 长按者是否也需要了解其他来源,或者我是否对其进行了更改?

下面的代码

@IBOutlet var tableView: UITableView!
@IBOutlet var changeDataBtn: UIButton!
@IBOutlet var ChangeBtn: UIButton!
var longPressRecognizer:UILongPressGestureRecognizer!
var refresh: UIRefreshControl!
var testList:[String] = []
var altList:[String] = ["Test Alt Cell 1","Test Alt Cell 2","Test Alt Cell 3","Test Alt Cell 4"]


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


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: "cell")! as UITableViewCell
    cell.textLabel?.text = testList[indexPath.row]
    return cell
}


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    var i = 1
    while i < 6{
        testList.append("Test Cell \(i)")
        i+=1
    }
    refresh = UIRefreshControl()
    refresh.attributedTitle = NSAttributedString(string: "Pull to refresh")
    refresh.addTarget(self, action: #selector(refreshData), for: UIControlEvents.valueChanged)
    tableView.addSubview(refresh)

    let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPress))
    self.view.addGestureRecognizer(longPressRecognizer)

}
func refreshData() {
    // Code to refresh table view
    doInBackGround()
}

func longPress(longPressGestureRecognizer: UILongPressGestureRecognizer) {
    if longPressGestureRecognizer.state == UIGestureRecognizerState.began {

        let touchPoint = longPressGestureRecognizer.location(in: self.view)
        if tableView.indexPathForRow(at: touchPoint) != nil {
            print("Long Press Detected")
            // your code here, get the row for the indexPath or do whatever you want
        }
    }
}


func doInBackGround(){
    testList.removeAll()
    DispatchQueue.global(qos: .background).async {
        print("Refreshing Data Source")
        var temp:[String] = []
        var i = 1
        while i < 9{
            temp.append("New Test Cell \(i)")
            i+=1
        }
        self.testList = temp

    }

    DispatchQueue.main.async {

        self.tableView.reloadData()
        self.refresh.endRefreshing()
    }
}


@IBAction func changeDataSrc(_ sender: AnyObject) {
    print("Changed Data Source")
    refresh.beginRefreshing()
    testList = altList
    tableView.reloadData()
    refresh.endRefreshing()
    //let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPress))
    //self.view.addGestureRecognizer(longPressRecognizer)
}






override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

您是什么意思“更改数据源”?

在我看来,您正在更改用于填充数据源的数组,但没有更改表视图的dataSource属性。

您已经获得了更改从后台馈入tableView(_, cellForRowAt:)的数组的代码。 这是一个坏主意,并且可能导致副作用,甚至崩溃。 您应该self.testList的分配移动到对DispatchQueue.main.async的调用内,以便从主线程更改数组。 我不知道这是否是您当前问题的原因,但很可能会引起某些问题。

编辑:

您的代码以前看起来像这样:

func doInBackGround(){
    testList.removeAll()
    DispatchQueue.global(qos: .background).async {
        print("Refreshing Data Source")
        var temp:[String] = []
        var i = 1
        while i < 9{
            temp.append("New Test Cell \(i)")
            i+=1
        }
        self.testList = temp
    }

    DispatchQueue.main.async {
        self.tableView.reloadData()
        self.refresh.endRefreshing()
    }
}

而是这样做:

func doInBackGround(){
    testList.removeAll()
    DispatchQueue.global(qos: .background).async {
        print("Refreshing Data Source")
        var temp:[String] = []
        var i = 1
        while i < 9{
            temp.append("New Test Cell \(i)")
            i+=1
        }
        //Once temp has been built, send a message to the main thread 
        //to reload the table view.
        DispatchQueue.main.async {
            self.tableView.reloadData()
            self.refresh.endRefreshing()
            self.testList = temp
        }
    }
}

修复程序正在从longPress中删除所有内容

所以看起来像这样:

func longPress(longPressGestureRecognizer: UILongPressGestureRecognizer) { print("Long Press Activated") }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM