Представление коллекции внутри делегата табличного представления - PullRequest
0 голосов
/ 06 июня 2019

У меня есть табличное представление с коллекционным представлением внутри строк таблицы.структура следующая:

MainViewController.swift:

class MainViewController: UIViewController {
     @IBOutlet weak var customTable: UITableView!
     func callSegue() {
         performSegue(withIdentifier: "customSegue", sender: self)
     }
     override func viewDidLoad() {
          customTable(UINib(nibName: "CustomTableCell", bundle: nil), forCellReuseIdentifier: "TipsTableCell")
     }
}
extension MainViewController: UITableViewDataSource {
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
         return 1
     }
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
          let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableCell", for: indexPath) as! CustomTableCell
          //Fill cell with my data
          return cell
     }
}

CustomTableCell.swift

class CustomTableCell.swift: UITableViewCell {
     @IBOutlet var collectionView: UICollectionView!
     override func awakeFromNib() {
         super.awakeFromNib()
         self.collectionView.dataSource = self
         self.collectionView.delegate = self
         self.collectionView.register(UINib.init(nibName: "CustomTableCell", bundle: nil), forCellWithReuseIdentifier: "CustomTableCell")
     }
}
extension CustomTableCell: UICollectionViewDataSource, UICollectionViewDelegate {
     func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
         return dataArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomTableCell", for: indexPath) as! CustomTableCell
 cell.label1.text = dataArray[indexPath.item]
return cell

и мой CustomCollectionvCell.swift

class CustomCollectionvCell: UICollectionViewCell {
     @IBOutlet weak var label1: UILabel!
     override func awakeFromNib() {
         super.awakeFromNib()
     }

Iнужно что-то вроде этого: мне нужно вызвать функцию "callSegue" в MainViewController, когда я коснулся ячейки, где label1.text == "Something".

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Используйте closures, чтобы решить это.

Добавьте closure в CustomTableCell и вызовите его, когда collectionViewCell будет задействован в методе collectionView(_:didSelectItemAt:), т.е.

class CustomTableCell: UITableViewCell {
    var handler: (()->())?
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        self.handler?()
    }
}

В MainViewController, установите closure во время удаления из очереди CustomTableCell в методе tableView(_:cellForRowAt:), т.е.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableCell", for: indexPath) as! CustomTableCell
    cell.handler = {[weak self] in
        self.callSegue() //here.....
    }
    return cell
}

Также перепроверьте, есть ли у вас segue с идентификатором customSegue в вашем storyboard.

0 голосов
/ 06 июня 2019

В вашем случае вам нужно реализовать делегат от CustomTableCell.swift и использовать в MainViewController.swift

// MainViewController.swift:

class MainViewController: UIViewController {
    @IBOutlet weak var customTable: UITableView!
    func callSegue() {
        performSegue(withIdentifier: "customSegue", sender: self)
    }
    override func viewDidLoad() {
        customTable(UINib(nibName: "CustomTableCell", bundle: nil), forCellReuseIdentifier: "TipsTableCell")
    }
}


extension MainViewController: UITableViewDataSource, collectionViewCellTapped {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableCell", for: indexPath) as! CustomTableCell
        //Fill cell with my data
        return cell
    }

    func cellTapped(_ text: String) {
        if let text = dataArray[indexPath.item], text == "Something" {
            callSegue()
        }
    }

}

// CustomTableCell.swift
protocol collectionViewCellTapped {
    func cellTapped(_ text: String)
}

class CustomTableCell : UITableViewCell {
    @IBOutlet var collectionView: UICollectionView!
    var delegate: collectionViewCellTapped!
    override func awakeFromNib() {
        super.awakeFromNib()
        self.collectionView.dataSource = self
        self.collectionView.delegate = self
        self.collectionView.register(UINib.init(nibName: "CustomTableCell", bundle: nil), forCellWithReuseIdentifier: "CustomTableCell")
    }
}

extension CustomTableCell: UICollectionViewDataSource, UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return dataArray.count
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomTableCell", for: indexPath) as! CustomTableCell
        cell.label1.text = dataArray[indexPath.item]
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if let delegate = self.delegate {
            delegate.cellTapped(text)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...