Наличие кнопки на контейнере просмотра выполняет действие с несвязанным контейнером просмотра - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть контроллер вида (VC0) с 3 контейнерами в нем, являющийся «левым» контроллером вида (VC1), «правым» контроллером вида (VC2) и «центральным» контроллером вида коллекции (VC3).

VC0 встроен в контроллер навигации и настроена кнопка «влево» и «вправо».Центральный вид (VC3) будет перемещаться влево или вправо при нажатии каждой кнопки, открывая меню на VC1 или VC2 внизу.

В правом контроллере представления «меню» (VC2) я хочу кнопку «редактировать»,Когда нажата кнопка «Редактировать», я хочу, чтобы центральная панель «свернулась» и вернулась в исходное положение (которое не сдвигается влево или вправо) и чтобы видимость была переключена на все ячейки в представлении коллекции.контроллер (VC3).Цель состоит в том, чтобы поместить кнопку «Удалить» в каждую ячейку, которая станет видимой при нажатии кнопки «Редактировать», чтобы ячейки можно было удалять по одной, нажимая кнопку «Удалить» в каждой ячейке, и скрывать, когдаПользователь завершил удаление ячеек.

Я могу получить кнопку редактирования, чтобы свернуть центральное представление с помощью делегата, но я не уверен, как изменить видимость всех ячеек при нажатии кнопки редактирования,Я пытался использовать делегат, замыкание и комбинацию обоих, но мне не повезло.Вот что у меня есть:

//VC0 - HOLDS CONTAINER VIEWS
import UIKit
class ContainerViewController: UIViewController, RightPanelDelegate {

    func hideLabel() {
        let vc = CenterCollectionCV()
        vc.hideLabel()
    }

    func collapsePanel() {
        animateCenterPanelXPosition(targetPosition: 0, duration: 0.5, springDamping: 0.6) { _ in
            self.currentState = .bothCollapsed
            self.leftView.isHidden = true
            self.rightView.isHidden = true
        }
    }
}
// VC2 - RIGHT CONTAINER
import UIKit

protocol RightPanelDelegate {
    func collapsePanel()
    func hideLabel()
}

class RightPanelVC: UIViewController {

    var delegate: RightPanelDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func buttonPressed(_ sender: Any) {
        delegate?.collapsePanel()
        delegate?.hideLabel()   
    }
}
//VC3 - CENTER CONTAINER
import UIKit

private let reuseIdentifier = "Cell"

class CenterCollectionCV: UICollectionViewController {

        func hideLabel() {
        // I'VE TRIED TO ACCESS THE CELL TO HIDE THE LABEL
        // I'VE TRIED USING A CLOSURE IN THE CELL
        // I'VE TRIED USING A DELEGATE IN THE CELL
        // I CAN'T FIGURE OUT THE STEPS OR WORKFLOW REQUIRED
        // COMMON ERROR IS "Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value" which I think will be because I'm not targeting an already instantiated cell but instead creating a new cell instance, eg: 

        // myCell = CenterCell()
        // myCell.label.isHidden = true

// But all the other approaches I've tried haven't worked either.

    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 1
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! CenterCell

        return cell
    }
}
// COLLECTION VIEW CELL
import UIKit

class CenterCell: UICollectionViewCell {

    @IBOutlet var label: UILabel!
}

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

Любые советы или помощь будет принята с благодарностью, спасибо.

1 Ответ

0 голосов
/ 26 сентября 2019

Ответ состоял в том, чтобы создать делегата в VC0 (представление с несколькими контейнерами) и реализовать его в VC3 (collectionView), который я уже пробовал, но ключом было добавление перехода между VC0 и VC3, который устанавливалделегат в VC0 до VC3.Как только я это сделал, все заработало.Поэтому в конечном итоге я ответил, что я неправильно настроил делегата.

Код теперь выглядит следующим образом:

//VC0 - HOLDS CONTAINER VIEWS
import UIKit

protocol ContainerViewControllerDelegate {
    func actionToPerform()
}

class ContainerViewController: UIViewController, RightPanelDelegate {

    var delegate: ContainerViewControllerDelegate?

    func hideLabel() {
        let vc = CenterCollectionCV()
        vc.hideLabel()
    }

    func collapsePanel() {
        animateCenterPanelXPosition(targetPosition: 0, duration: 0.5, springDamping: 0.6) { _ in
            self.currentState = .bothCollapsed
            self.leftView.isHidden = true
            self.rightView.isHidden = true
        }
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.destination is RightPanelVC {
            let vc: RightPanelVC = segue.destination as! RightPanelVC
            vc.delegate = self
        }

        if segue.destination is ViewController {
            let vc: ViewController = segue.destination as! ViewController
            self.delegate = vc
        }
    }
}
//VC3 - CENTER CONTAINER
import UIKit

private let reuseIdentifier = "Cell"

class CenterCollectionCV: UICollectionViewController, ContainerViewControllerDelegate {

    func actionToPerform() {
    // perform tasks related to collectionView or cell here
    collectionView.isHidden = true
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 1
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! CenterCell

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