【问题标题】:Swift use Delegate to refresh TableviewSwift 使用 Delegate 刷新 Tableview
【发布时间】:2021-03-28 06:02:55
【问题描述】:

我在 viewController 中有 tableviewA。我使用 XIBs 作为 tableViewA 的单元格。在那些 XIB 里面,我有另一个 tableViewB。使用委托,一旦我从服务器获取数据,我会尝试从 viewController 刷新 tableViewB。

使用的代码如下。不知道为什么 tableViewB 从服务器接收到数据后没有刷新

1.定义协议

protocol tblRefresh: NSObject {
 func refreshTbl()
}

2.ViewController

class HomeVC: UIViewController, UITableViewDelegate, UITableViewDataSource {

weak var delegateTblRefresh : tblRefresh?

  //tableViewA defined here

   func getDataFromServer(){
     // get data from server
     self.delegateTblRefresh?.refreshTbl()
   }
}

3.XIB作为tableViewA的单元格

class Challengers: UITableViewCell, UITableViewDelegate, UITableViewDataSource, tblRefresh {

@IBOutlet weak var tableViewB: UITableView!

let homeVC = HomeVC()

  override func awakeFromNib() {
    super.awakeFromNib()
    homeVC.delegateTblRefresh = self
  }

  //tableViewB defined here

  func refreshTbl() {
    tableViewB.reloadData()
  }

}

【问题讨论】:

  • HomeVC 在哪里实例化?你确定它是从HomeVC.shared 实例化的,而不仅仅是HomeVC
  • 进行了更正。然而它并没有解决我的问题。
  • 所以你打电话给let homeVC = HomeVC()——但是你把它放在屏幕上的什么地方?似乎屏幕上的HomeVC 可能与您在Challengers 中所指的不一样

标签: swift delegates protocols


【解决方案1】:
  1. 您正在创建不需要的 HomeVC 的新实例。

  2. 您不需要编写自己的委托方法来刷新 tableView 单元格。当您从服务器获取数据时,只需重新加载表。例如:

    func getDataFromServer()  
    {
    
     // get data from server
    
     self.tableViewA.reloadData()
    
    }
    

或者,如果您只想重新加载特定单元格,您也可以这样做。

【讨论】:

  • 服务器的数据来得很频繁。因此,我只想刷新 tableViewB 而不是刷新整个 tableViewA。
  • 你想刷新每个tableViewB还是特定的tableViewB?
  • 而且你写委托的方式是错误的。
  • Arnab Ahamed Siam - 怎么回事?正确的方法是什么??
  • 你可以从你的主视图控制器重新加载你想要的tableView的任何单元格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多