gpt4 book ai didi

ios - 如何更新已呈现的上下文菜单中的值?

转载 作者:行者123 更新时间:2023-12-03 19:01:41 26 4
gpt4 key购买 nike

我正在关注本教程 https://kylebashour.com/posts/context-menu-guide我正在尝试重新调整此片段的用途,该片段显示了上下文菜单:

class TableViewController: UITableViewController {
let data: [MyModel] = []

override func viewDidLoad() {
super.viewDidLoad()

// Configure the table view
}

override func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
let item = data[indexPath.row]

return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { suggestedActions in

// Create an action for sharing
let share = UIAction(title: "Share", image: UIImage(systemName: "square.and.arrow.up")) { action in
print("Sharing \(item)")
}

// Create other actions...

return UIMenu(title: "", children: [share, rename, delete])
}
}
}

上下文菜单出现 5 秒后我想更新菜单标题

UIMenu(title: "expired", children: [share, rename, delete])

并确保其子级具有 .disabled 属性集。

UIAction(title: "Share", image: UIImage(systemName: "square.and.arrow.up", , attributes: .disabled)

有没有办法可以更新已呈现的上下文菜单的标题及其子项的属性?

最佳答案

如果您想要动态表,您应该使用数据模型,并在每次想要更改 TableView 上显示的数据时更新它们。

我的意思是?一个好的方法是为 TableView 中的每一行建立一个模型,其中包含您想要在该行中显示的数据 (CellModel)。

因此,在您的 TableView Controller 中,您将拥有一个 CellModel 列表:

private var cellModels = [ CellModel ]()

在 View 上创建单元格模型并加载函数并实现 UITableViewDatasource 函数:

// MARK: - UITableViewDatasource implementation.
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.cellModels.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellModel = self.cellModels[indexPath.row]

let cell = tableView.dequeueReusableCell(withIdentifier: kTableViewCellIdentifier, for: indexPath)
cell.textLabel?.text = cellModel.cellData.menuDataTitle

return cell
}

现在是时候使用 CellModel 类了:该类表示您要在一行中显示的数据。在这个简单教程的每一行中,您都显示一个带有标题的字符串,但想象一下您想要显示标题、副标题和图像,在这种情况下,创建一个类来表示您要处理的数据很方便显示在行上。我将其命名为“CellData”:

class CellData {
// MARK: - Vars.
private(set) var menuDataTitle: String

// MARK: - Initialization.
init(title: String) {
self.menuDataTitle = title
}
}

另一方面,对于每一行,您都有一个要显示的菜单,因此有一个模型来表示您要显示的菜单会很方便。我将其命名为“CellContextMenuData”:

class CellContextMenuData {
// MARK: - Vars.
private(set) var contextMenuTitle: String
private(set) var contextMenuActions = [ UIAction ]()

// MARK: - Initialization.
init(title: String) {
self.contextMenuTitle = title
}
}

此模型有一个标题和要在菜单上显示的操作:

// MARK: - UITableViewDelegate.
override func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
let cellModel = self.cellModels[indexPath.row]
let cellContextMenuData = cellModel.cellContextMenuData

return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { suggestedActions in
return UIMenu(title: cellContextMenuData.contextMenuTitle, children: cellContextMenuData.contextMenuActions)
}
}

因此,每次您想要更改菜单标题(或操作)时:

1 - 检索表示您要更改的行的单元格模型。

2 - 更改 CellContextMenuData 的标题。

3 - 重新加载桌面 View 。

示例:

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)

// Timer to change our data.
Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { [weak self] timer in
let cellModel = self?.cellModels[3]
let cellContextMenuData = cellModel?.cellContextMenuData

cellContextMenuData?.contextMenuUpdate(title: "Expired")
cellContextMenuData?.contextMenuSetActionsShareUpdateDelete()

self?.tableView.reloadData()
}
}

我创建了一个示例,请随意使用/查看它:https://bitbucket.org/gastonmontes/contextmenuexample

关于ios - 如何更新已呈现的上下文菜单中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60880247/

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