我刚刚开始学习Swift编程。
打开应用程序后,我正在将数组加载到UITableView中。 但是,当用户向左滑动时,相同的UITableView应该加载第二个数组,而向右滑动,则UITableView应该再次加载第一个数组。
我已经测试了以下代码,它会根据滑动来更改颜色。但是,我无法加载第二个数组。
override func viewDidLoad() {
super.viewDidLoad()
let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(sender:)))
view.addGestureRecognizer(rightSwipe)
}
@objc func handleSwipe(sender: UISwipeGestureRecognizer) {
if sender.state == .ended {
switch sender.direction {
case .right:
view.backgroundColor = .red
print("Right swipe")
let newCell = goNext(tblView, cellForRowAt: idxPath)
print(newCell)
}
func goNext(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "chapterCell", for: idxPath)
if currentChapter != totalChapters[0] {
cell.textLabel?.numberOfLines = 0
cell.textLabel?.text = genCh2[indexPath.row]
}
return cell
}
答案 0 :(得分:0)
两件事:您需要一个tableView数据源,并且滑动手势具有方向,需要进行设置。
class MyViewController : UIViewController , UITableViewDataSource{
var tblView : UITableView!
var genCh1 = ["first","second","later"]
var genCh2 = ["data","data1","data2"]
var currentData : [String]?
//TableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return currentData?.count ?? 0
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "chapterCell", for: indexPath)
//if currentChapter != totalChapters[0] {
cell.textLabel?.numberOfLines = 0
cell.textLabel?.text = currentData?[indexPath.row]
// }
return cell
}
func reloadData(_ array : [String]){
currentData = array
tblView.reloadData()
}
override func viewDidAppear(_ animated: Bool) {
// setup viewController
super.viewDidAppear(animated)
tblView = UITableView.init(frame: view.bounds)
tblView.backgroundColor = .red
view.addSubview(tblView)
tblView.dataSource = self
tblView.register(UITableViewCell.self, forCellReuseIdentifier: "chapterCell")
reloadData(genCh1)
//add gesture
let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(sender:)))
rightSwipe.direction = .right
view.addGestureRecognizer(rightSwipe)
let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(sender:)))
leftSwipe.direction = .left
view.addGestureRecognizer(leftSwipe)
}
@objc func handleSwipe(sender: UISwipeGestureRecognizer) {
if sender.state == .ended {
switch sender.direction {
case .right:
view.backgroundColor = .red
print("Right swipe")
reloadData(genCh1)
case .left:
view.backgroundColor = .blue
print("Left swipe")
reloadData(genCh2)
default:
break;
}}}
}
答案 1 :(得分:0)
我认为您的困惑源自UITableViewControllers在显示和更新数据方面的工作方式。最终,UITableView数据源有责任提供正确的数据进行显示。您不想直接更新单元格。而是让tableview重新加载,然后确保适当的数据源方法将提供所需的数据(在这种情况下,cellForRowAt是我们最感兴趣的方法)。我的某些事情基本上可以满足您的要求,希望可以使您朝正确的方向开始。
表视图通常不使用您所描述的100%左滑动来表示用户正在尝试删除单元格。如下面的示例所示,向左滑动将永远不会注册。因此,长期使用您描述的滑动手势可能不是最佳选择。
class TableViewController: UITableViewController {
let dataArray1 = ["1", "2", "3"]
let dataArray2 = ["red", "blue", "green"]
var activeArray = 1
override func viewDidLoad() {
super.viewDidLoad()
let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(_:)))
view.addGestureRecognizer(rightSwipe)
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseId", for: indexPath)
cell.textLabel?.text = activeArray == 1 ? dataArray1[indexPath.row] : dataArray2[indexPath.row]
return cell
}
@objc func handleSwipe(_ sender: UISwipeGestureRecognizer) {
if sender.state == .ended {
switch sender.direction {
case .right:
self.activeArray = 2
self.tableView.reloadData()
case .left:
self.activeArray = 1
self.tableView.reloadData()
default:
break
}
}
}
}