使用Button更改表视图数据源不起作用?

时间:2018-06-23 00:42:06

标签: swift uitableview delegates protocols

当前,我在表格视图的顶部有一个开关,可以更改数据的来源。交换机调用此功能

   @objc func controlValueChanged(_sender: BetterSegmentedControl) {
    if _sender.index == 0 {
        //friend feed
        tableView.dataSource = HomeViewController()
        tableView.delegate = HomeViewController()
        tableView.reloadData()
            print("friends")

    }
    else if _sender.index == 1 {
        //school feed
        tableView.dataSource = schoolFeedViewController()
        tableView.delegate = schoolFeedViewController()
        tableView.reloadData()
    print("school")
    }

}

当我将状态从索引0更改为索引1时,表视图似乎切换了,尽管由于数据源为空,所以没有表视图显示。但是,当我从索引1切换到索引0时,什么也没有发生。控制台日志显示“朋友”,但未显示表视图。

这是schoolFeedViewController()的代码:

    class schoolFeedViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var tableView: UITableView!
    var postList = [Post]()
    var currentSchool: String?
    var currentGrade: String?
    var schoolExists: Bool?

    override func viewDidLoad() {
        super.viewDidLoad()
        getSchool()
        fetchFeed()
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "schoolFeedCell") as! schoolFeedTableViewCell
        let schoolPost = postList[indexPath.row]

        cell.post.text = schoolPost.post_words
        return cell
    }
}

我尝试更改委托并将表视图从第二个数据源中删除,但无济于事。

2 个答案:

答案 0 :(得分:1)

我有您的解决方案

  1. 将_sender.index值的状态保存在一个Int变量'selectedTab'中

  2. 调用@objc func controlValueChanged(_sender: BetterSegmentedControl) {时 只能在两个索引上重新加载tableview

     if _sender.index == 0 {
        //friend feed
        tableView.reloadData()
            print("friends")
    
    }
    else if _sender.index == 1 {
        //school feed
        tableView.reloadData()
    

    }

  3. 之类的DataSouce方法使用切换用例

    func tableView(_ tableView:UITableView,numberOfRowsInSection部分:Int)-> Int {

        switch selectedTab {
        case 0:
            return arrFrind.count
        case 1:
            return arrScool.count
        default:
            return 0
        }
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        switch selectedTab {
    
        case 0:
    
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell0")!
    
            return cell
    
        case 1:
    
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell1")!
    
            return cell
    
    
        default:
            return UITableViewCell()
        }
    
    }
    
  4. 在selected开关中选项卡的值为_sender.index

  5. 完成简单

答案 1 :(得分:0)

您忘了像这样的委托方法

 func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

请提供此代码 还要检查您的数据数组是否为空 但是我建议您提供两个不同的原型单元并在它们之间切换,而不要完全更改tableview数据源和委托