gpt4 book ai didi

ios - 如何将数据从弹出框内的 uicollectionview 中的按钮单击发送到主视图 Controller 中的表格单元格?

转载 作者:行者123 更新时间:2023-11-28 13:49:44 25 4
gpt4 key购买 nike

如何将数据从弹出窗口内的 uicollectionview 中的按钮单击发送到主视图 Controller 中的表格单元格?

我有一个带有自定义单元格的 UITableView。当我单击单元格内的“1”时,它会弹出一个弹出窗口。弹出窗口使用带有 UICollectionView 的 UIView 作为 subview 。 Collection View 内部是自定义单元格,每个单元格都有一个按钮。所需的行为是单击弹出窗口中的按钮并让该按钮通过委托(delegate)执行功能,并在主视图 Controller 中的自定义 UITableViewCell 内设置按钮的按钮标题。

主视图 Controller :

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

}
}

Screenshot

最佳答案

您的单元格不需要也不应该直接与弹出窗口通信。看到您已经呈现了其中至少有一个单元格的 TableView ,我假设您已经为它设置了一个数据源 (UITableViewDataSource)。太好了,你已经成功了一半。当您加载屏幕(即 View Controller )时,tableview 会询问数据源如何为每一行呈现其单元格 (cellForRowAtIndexPath:),我假设您在其中设置了标签 ("test") 并在框中为该 1 分配一个值。

现在您需要从弹出窗口中读取值,将其报告回您的 Controller ,然后 Controller 将通知 tableview 重新加载。您需要为弹出框控件设置另一个委托(delegate),它将发送回调中点击的任何值。请注意,您应该只需要一个弹出框实例,而不是每一行都需要一个。假设您的 popover 的委托(delegate)方法称为 didSelectValue:,一旦它被调用,您应该使用新值更新 tableview 的数据源,然后调用 tableView.reloadData() 或者如果您想要更手术,tableView.reloadRows(at:with:)。 tableview 将重新加载其行,并将显示其数据源(通过弹出窗口)中的新值。希望这可以帮助。

关于ios - 如何将数据从弹出框内的 uicollectionview 中的按钮单击发送到主视图 Controller 中的表格单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54846771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com