перейти от кнопки внутри uicollectionviewcell - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь программно перейти с помощью кнопки внутри uicollectionviewcell. Все, что я хочу сделать, это перейти к классам. Я получаю сообщение об ошибке. Значение типа 'CustomCell' не имеет члена 'present'. Этот код работает в обычном классе uiviewcontroller. Мой код ниже.

    class CustomCell: UICollectionViewCell {
@objc func moveRight() {

         let vc = fullScreen()
         self.present(vc, animated: true)

}}

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Есть несколько способов сделать это.

  1. Делегат
  2. Закрытие
  3. Уведомление
  4. и т. Д.

    1. Делегат
    class customerCell: UITableViewCell {
        weak var delegate: YourDelegate!
    
        @IBAction func yourButtonTap(_ sender: UIButton) {
            self.delegate.onButtonTap()
        }
    }
    
    class YourTableViewController: UITableViewController {
        // Your Codes
    
        func tableView(......., cellForRowAt: indexPath) {
            let cell = yourCell()
    
            cell.delegate = self
    
            return cell
        }
    }
    
    Закрытие
protocol YourDelegate: class {
    func onButtonTap()
}

class customerCell: UITableViewCell {
    var onButtonTapHandler: (() -> void)?

    @IBAction func yourButtonTap(_ sender: UIButton) {
        guard let handler = onButtonTapHandler else { return }
        handler()
    }
}

class YourTableViewController: UITableViewController {
    // Your Codes

    func tableView(......., cellForRowAt: indexPath) {
        let cell = yourCell()

        cell.onButtonTapHandler = {
            // Your segue code here
        }

        return cell
    }
}
Центр уведомлений
class YourTableViewController: UITableViewController {
    override func viewDidLoad() {
        NotificationCenter.default.addObserver(forName: Notification.Name("NotificationName"), object: nil, queue: .main) { (_) in
            //your segue code here
        }
    }
}

class customerCell: UITableViewCell {
    var onButtonTapHandler: (() -> void)?

    @IBAction func yourButtonTap(_ sender: UIButton) {
        NotificationCenter.default.post(name: Notification.Name("NotificationName"), object: nil)
    }
}
0 голосов
/ 07 октября 2019

Что вам нужно сделать, это добавить свойство в классе вашей ячейки с именем parentVC или что-то подобное:

class CustomCell: UICollectionViewCell {

    var parentVC: UIViewController!

    ...

}

Затем, в любом контроллере представления используется ячейка представления сбора, вам нужноустановите parentVC в методе collectionView:, cellForItemAt indexPath::

class SomeViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomCell", for: indexPath) as! CustomCell
        cell.parentVC = self

        ...

        return cell
    }
}

Теперь ваша пользовательская ячейка может сказать своему родительскому контроллеру представления представить новый контроллер представления:

class CustomCell: UICollectionViewCell {

    var parentVC: UIViewController!

    @objc func moveRight() {

         let vc = fullScreen()
         //Tell the cell's parent VC to present the new VC. A UICollectionViewCell cannot present a view controller
         parentVC.present(vc, animated: true)

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...