[英]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.