Как отправить данные из нажатия кнопки в представлении uicollection внутри всплывающего окна в ячейку таблицы в контроллере основного представления? - PullRequest
0 голосов
/ 24 февраля 2019

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

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

MainViewController:

import UIKit

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

...

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

PopoverCell:

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)
    }

}
}

Screenshot

1 Ответ

0 голосов
/ 24 февраля 2019

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

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

...