Как отправить данные по нажатию кнопки в uicollectionview внутри всплывающего окна в ячейку таблицы в контроллере основного представления?

Как отправить данные по нажатию кнопки в uicollectionview внутри всплывающего окна в ячейку таблицы в контроллере основного представления?

У меня есть UITableView с пользовательскими ячейками. Когда я нажимаю на «1» внутри ячейки, появляется всплывающее окно. Всплывающее окно использовало UIView с UICollectionView в качестве подпредставления. Внутри представления коллекции находятся настраиваемые ячейки, каждая из которых имеет кнопку. Желаемое поведение состоит в том, чтобы щелкнуть кнопку во всплывающем окне и заставить эту кнопку выполнять функцию через делегата и установить заголовок кнопки для кнопки внутри пользовательского UITableViewCell в контроллере основного представления.

MainViewController:

import UIKit

class MainViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, ListItemCellDelegate, PopoverCellDelegate {

...

func setPriority(buttonTitle: String) {
    print("Button Pressed")
}

ПоповерСелл:

import UIKit
import Foundation

protocol PopoverCellDelegate: class {
    func setPriority(buttonTitle: String)
}

class PopoverCell: UICollectionViewCell {
weak var delegate: PopoverCellDelegate?

let cellView: UIView = {
    let view = UIView()
    view.backgroundColor = UIColor.white
    view.setCellShadow()
    return view
}()

let priorityButton: UIButton = {
    let button = UIButton(type: .custom)

    //        button.setImage(UIImage(named: "UnChecked"), for: .normal)
    //        button.setImage(UIImage(named: "Checked"), for: .selected)
    button.frame = CGRect(x: 0, y: 0, width: 60, height: 60)
    button.setTitleColor(.black, for: .normal)
    button.backgroundColor = UIColor.white
    button.layer.borderWidth = 2
    button.layer.borderColor = UIColor.black.cgColor
    button.titleLabel?.font = UIFont.init(name: "Avenir Next", size: 24)
    return button
}()

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func prepareForReuse() {
    super.prepareForReuse()
    self.delegate = nil
}

override init(frame: CGRect) {
    super.init(frame: frame)
    setupCell()
    priorityButton.addTarget(self, action: #selector(setPriority), for: .touchUpInside)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

func setupCell() {
    cellView.translatesAutoresizingMaskIntoConstraints = false
    priorityButton.translatesAutoresizingMaskIntoConstraints = false

    addSubview(cellView)
    cellView.addSubview(priorityButton)

    cellView.heightAnchor.constraint(greaterThanOrEqualToConstant: 60).isActive = true
    cellView.setAnchor(top: topAnchor, left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, paddingTop: 8, paddingLeft: 4, paddingBottom: 8, paddingRight: 4)
    priorityButton.setAnchor(top: cellView.topAnchor, left: cellView.leftAnchor, bottom: cellView.bottomAnchor, right: cellView.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 60, height: 60)
    priorityButton.centerXAnchor.constraint(equalTo: cellView.centerXAnchor).isActive = true
}

@objc private func setPriority() {
    if let title = priorityButton.currentTitle {
        print(title)
        self.delegate?.setPriority(buttonTitle: title)
    }

}
}

Скриншот


person Timothy Waters    schedule 23.02.2019    source источник


Ответы (1)


Ваши ячейки не должны и не должны взаимодействовать напрямую с всплывающим окном. Видя, что у вас уже есть табличное представление, по крайней мере, с одной ячейкой, я предполагаю, что вы уже настроили для него источник данных (UITableViewDataSource). Это здорово, вы на полпути. Когда вы загружаете экран (т. е. контроллер представления), табличное представление спрашивает источник данных, как отображать его ячейки для каждой строки (cellForRowAtIndexPath:), где я предполагаю, что вы устанавливаете метку ("test") и назначаете значение для этого 1 в поле .

Теперь вам нужно прочитать значение из всплывающего окна, сообщить об этом вашему контроллеру, который затем сообщит табличному представлению о перезагрузке. Вам нужно будет настроить другого делегата для управления всплывающим окном, которое будет отправлять любое значение, которое было выбрано в обратном вызове. Обратите внимание, что вам нужен только один экземпляр всплывающего окна, вам не нужно по одному экземпляру для каждой строки. Скажем, метод делегата вашего всплывающего окна называется didSelectValue:, после его вызова вы должны обновить источник данных табличного представления с новым значением, а затем вызвать либо tableView.reloadData(), либо, если вы хотите быть более хирургическим, tableView.reloadRows(at:with:). Табличное представление перезагрузит свои строки, и будет показано новое значение из его источника данных (через всплывающее окно). Надеюсь это поможет.

person olx    schedule 23.02.2019