当我使用Swift 4.2和iOS12向左滑动时,如何将第二个数组加载到UITableView中?

时间:2019-01-10 17:58:47

标签: ios swift uitableview ios12

我刚刚开始学习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
}

2 个答案:

答案 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
            }
        }
    }

}