Выполнить переходную кнопку щелчка из представления коллекции в представлении таблицы - PullRequest
0 голосов
/ 07 декабря 2018

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

Когда нажата кнопка из представления коллекции, я хочу выполнить переход к другому контроллеру представления.И передать данные.(Но только кнопка, а не ячейка)

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Если вы создали ячейки в самой раскадровке, то вы можете напрямую создать функцию @IBAction в главном ViewController

ИЛИ

Если вы создали xib, попробуйте этот способ

Вы можете сделать это разными способами, но я предпочитаю делать это из Уведомления.

Попробуйте это

Прежде всего вы должны добавить наблюдателя в ваш главный контроллер, из которого вы хотите выполнить переход.вот так:

NotificationCenter.default.addObserver(self, selector: #selector(self.testFunc(notification:)), name: Notification.Name("navigateToController"), object: nil)

Вот код для вашего основного класса:

class YourMainViewController : UIViewController {

      @IBOutlet weak var tableView : UITableView!

      override func viewDidLoad() {
          super.viewDidLoad()
          NotificationCenter.default.addObserver(self, selector: #selector(self.testFunc(notification:)), name: Notification.Name("navigateToController"), object: nil)
    }

    @objc func testFunc(notification:Notification)  {
         let object = notification.object as! YourObjectType /// For ex : [String], Int, CustomModel, Any etc..
         let storyboard = UIStoryboard(name: "Main", bundle: nil)
         let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewController") as! YourViewController
         viewController.object = object
         self.navigationController?.pushViewController(viewController, animated: true)
    }
}

Вот код для вашего класса ячеек табличного представления:

class yourTableViewCell: UITableViewCell {

      func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "reuseIdentifier", for: indexPath) as! YourCollectionCell
            cell.yourCellButton.addTarget(self, action: #selector(self.actionCellButton()), for: .touchUpInside)
            return cell
      }

     @objc func actionCellButton() {
         let myArr = ["1","2","3"]
         NotificationCenter.default.post(name: Notification.Name("navigateToController"), object: myArr)
     }
}

Когда вы нажмете свою кнопку, будет вызвана функция actionCellButton () , и отсюда вы можете передать данные в объект уведомления.

Сразу после вызова функции actionCellButton () будет вызвана testFunc () и вы получите данные, которые вы передали в actionCellButton () функция и код будут выполнены.

0 голосов
/ 07 декабря 2018

Полагаю, у вас есть подкласс UICollectionViewCell с данными внутри, поэтому вы можете добавить действие для своей кнопки в ячейку

class YourCell: UICollectionViewCell {
    ...
    var item: Item?
    ...
    @IBAction func buttonPressed(_ sender: UIButton) {
    }
    ...
}

Теперь создайте делегат вашей ячейки

protocol YourCellDelegate {
    func buttonPressed(pass data: Item)
}

и создайте переменную делегата в вашей ячейке

class YourCell: UICollectionViewCell {
    ...
    var delegate: YourCellDelegate?
    ...
}

, затем в действии кнопки вызовите метод делегата и передайте данные, если вам нужно

@IBAction func buttonPressed(_ sender: UIButton) {
    delegate?.buttonPressed(pass: item!)
}

Теперь внедрите протокол YourCellDelegate к вашему UITableViewCell а также объявить, что должно происходить при нажатии кнопки.Для этого создайте делегат ваших UITableViewCell и

protocol TableViewCellDelegate {
    func buttonInYourCellPressed(pass data: Item)

class TableViewCell: UITableViewCell, YourCellDelegate {
    ...
    var delegate: TableViewCellDelegate?
    ...
    func buttonPressed(pass data: Item) {
        delegate?.buttonInYourCellPressed(pass data: date)
    }
}

также в методе источника данных представления коллекции в UITableViewCell установите делегат ячейки как ваш TableViewCell

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    ...
    cell.delegate = self
    ...
}

наконец реализуйтеваш TableViewCellDelegate к вашему UIViewController и объявите, что должно произойти, когда кнопка в представлении коллекции нажата

class ViewController: UIViewController, TableViewCellDelegate {
    ...
    func buttonInYourCellPressed(pass data: Item) {
        performSegue(withIdentifier: "identifier", sender: data)
    }
}

В конце установите делегата TableViewCell в UITableView метод источника данных cellForRowAt в качестве вашегоViewController

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ...
    cell.delegate = self
    ...
}

, затем в prepare(for segue: в вашем ViewController вы можете просто назначить свойство целевого ViewController для пониженного отправителя

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "identifier" {
        let destinationVC = segue.destination as! SecondViewController
        destinationVC.selectedItem = sender as! Item
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...