从另一个表视图单元格中的段出口向表视图单元格内的集合视图发送信号

Sending a signal to collection view within tableview cell from a segment outlet in another tableview cell

我在 VC 的表格视图单元格中有一个段出口。有两个索引:1 和 2.

当我点击 2 时,我想告诉另一个 tableviewcell 中的集合视图重新加载另一个视图。

当我点击返回 1 时,我希望再次加载相同的集合视图并显示原始内容。

这是我的视图控制器函数:

class MyProfileTableViewController: UIViewController, UITableViewDelegate,   UITableViewDataSource,segment
 {

 //Variable selection to determine what is selected - 1 by default
 var viewSelected = "1"

 //Segment Function - viewSelected is used to tell VC what index it's on
  func segmentSelected(tag: Int, type: String) {
    if type == "1" {
        print("1")
        viewSelected = "1"
    } else if type == "2" {
        print("2")
        viewSelected = "2"
    }
 }


 //Cell For Row - tells tableviewcell to look at viewSelected
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell  = AboutTableView.dequeueReusableCell(withIdentifier: "ProfileSegmentTableViewCell", for: indexPath) as! ProfileSegmentTableViewCell
  cell.segmentCell = self
  return cell
  } else {
  let cell  = AboutTableView.dequeueReusableCell(withIdentifier: "1_2Cell", for: indexPath) as! 1_2Cell
  cell.viewSelected = viewSelected
  return cell
  }

这里是段控件TableviewCell

 //protocol used to delegate
 protocol segment: UIViewController {
func segmentSelected(tag: Int, type: String)
}

class ProfileSegmentTableViewCell: UITableViewCell {

@IBOutlet weak var profileSegmentControl: UISegmentedControl!

var segmentCell: segment?


  @IBAction func segmentPressed(_ sender: Any) {
    profileSegmentControl.changeUnderlinePosition()
    
    let Index = self.profileSegmentControl.selectedSegmentIndex
    if Index == 0
    {
        segmentCell?.segmentSelected(tag: (sender as AnyObject).tag, type: "1")
        )
    } else {
        segmentCell?.segmentSelected(tag: (sender as AnyObject).tag, type: "2")
        
    }
}

集合视图

 //variable by default
 var viewSelected = "1"

 //viewDidLoad
 override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    cView.delegate = self
    cView.dataSource = self
    get {
        self.cView.reloadData()
        self.cView.layoutIfNeeded()
    }
}

 func get(_ completionHandler: @escaping () -> Void)  {
  getCount.removeAll() 
  if viewSelected = "1" {
  print("1") } else {
  print("2)
  }
  completionHandler()
 }

您可以使用 NotificationCenter.default.addObserver... 方法和 NotificationCenter.default.post..... 了解它们。并且不要忘记在 deinit

中删除观察者

这是一个使用 closure 的非常简单的示例,因此您的分段控制单元可以与您的 table 视图控制器通信。

您的手机 class 可能如下所示:

class ProfileSegmentTableViewCell: UITableViewCell {
    @IBOutlet var profileSegmentControl: UISegmentedControl!
    
    var callback: ((Int)->())?
    
    @IBAction func segmentPressed(_ sender: Any) {
        guard let segControl = sender as? UISegmentedControl else { return }
        // tell the controller that the selected segment changed
        callback?(segControl.selectedSegmentIndex)
    }
}

当用户更改所选段时,单元格使用 callback 闭包通知控制器已选择段。

然后,在您的控制器中,您可以使用 var 来跟踪当前选定的段索引:

// track selected segment index
var currentIndex: Int = 0

您的 cellForRowAt 代码将如下所示:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.row == 0 {
        // first row - use cell with segemented control
        let cell = tableView.dequeueReusableCell(withIdentifier: "ProfileSegmentTableViewCell", for: indexPath) as! ProfileSegmentTableViewCell
        
        // set the segemented control's selected index
        cell.profileSegmentControl.selectedSegmentIndex = self.currentIndex
        
        // set the callback closure
        cell.callback = { [weak self] idx in
            guard let self = self else {
                return
            }
            // update the segment index tracker
            self.currentIndex = idx
            // reload row containing collection view
            self.tableView.reloadRows(at: [IndexPath(row: 1, section: 0)], with: .automatic)
        }
        
        return cell
    } else if indexPath.row == 1 {
        // second row - use cell with collection view
        let cell = tableView.dequeueReusableCell(withIdentifier: "1_2Cell", for: indexPath) as! My_1_2Cell
        
        // tell the cell which segment index is selected
        cell.setData(currentIndex)
        
        return cell
    }
    
    // all other rows - use simple Basic cell
    let cell = tableView.dequeueReusableCell(withIdentifier: "PlainCell", for: indexPath) as! PlainCell
    cell.textLabel?.text = "Row \(indexPath.row)"
    return cell
}

这是一个完整的示例,您可以 运行 并检查:https://github.com/DonMag/ClosureExample