У меня есть сегментный выход в ячейке tableview в 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
  }

Вот таблица управления сегментамиviewCell

 //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")
        
    }
}

CollectionView

 //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()
 }
0
WhySoSerious33 10 Сен 2021 в 17:30

2 ответа

Лучший ответ

Вот очень простой пример использования closure, чтобы ваша ячейка сегментированного управления могла взаимодействовать с вашим контроллером табличного представления.

Ваш класс ячейки может выглядеть так:

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

1
DonMag 10 Сен 2021 в 18:49

Вы можете использовать метод NotificationCenter.default.addObserver ... и NotificationCenter.default.post ..... Прочтите о них. И не забудьте удалить наблюдателей в deinit

-1
isHidden 10 Сен 2021 в 14:48