使用 forEach 创建 UIAction
Use forEach for creating UIActions
我想使用 UIMenu
创建一个类似于菜单的过滤器,该菜单将从 UIBarButtonItem
打开
private func createFilteringMenu() -> UIMenu {
let fivePhotos = UIAction( title: "5", image: UIImage(systemName: "photo")) { [weak self] _ in
guard let this = self else { return }
this.fetchImages(limit: 5)
}
let tenPhotos = UIAction( title: "10", image: UIImage(systemName: "photo")) { [weak self] _ in
guard let this = self else { return }
this.fetchImages(limit: 10)
}
let twentyPhotos = UIAction( title: "20", image: UIImage(systemName: "photo")) { [weak self] _ in
guard let this = self else { return }
this.fetchImages(limit: 20)
}
let thirtyPhotos = UIAction( title: "30", image: UIImage(systemName: "photo")) { [weak self] _ in
guard let this = self else { return }
this.fetchImages(limit: 30)
}
let menuActions = [fivePhotos, tenPhotos, twentyPhotos, thirtyPhotos]
let addNewMenu = UIMenu( title: "Select number of photos", children: menuActions)
return addNewMenu
}
我认为这是非常糟糕的(重复代码太多)。我想通过使用 forEach:
来做到这一点
private func createFilteringMenu() -> UIMenu {
let numberOfItems = [5, 10, 15, 20, 25, 30]
var menuActions: [UIAction] = []
numberOfItems.forEach{ index in
if index < numberOfItems.count {
let item = UIAction( title: "\(numberOfItems[index])", image: UIImage(systemName: "photo")) { [weak self] _ in
guard let this = self else { return }
this.fetchImages(limit: numberOfItems[index])
}
menuActions.append(item)
}
}
let addNewMenu = UIMenu( title: "Select number of photos", children: menuActions)
return addNewMenu
}
但当然它只是添加了最后一项 (30),谁能帮我添加所有项目(或类似的东西)。
非常感谢
forEach 给出的是值而不是索引。
因此不需要 if 条件,因为它实际上是在每次迭代中根据数组长度检查值
is 5 < 6 -> true
is 10 < 6 -> false
is 15 < 6 -> false
is 20 < 6 -> false
is 25 < 6 -> false
is 30 < 6 -> false
这就是为什么您的菜单中只显示一项的原因
试试这个,看看它是否能解决您的问题。
private func createFilteringMenu() -> UIMenu {
var menuActions: [UIAction] = []
numberOfItems.forEach{ value in
let item = UIAction( title: "\(value)",
image: UIImage(systemName: "photo"))
{ [weak self] _ in
guard let this = self else { return }
this.fetchImages(limit: value)
}
menuActions.append(item)
}
return UIMenu(title: "Select number of photos",
children: menuActions)
}
我想使用 UIMenu
创建一个类似于菜单的过滤器,该菜单将从 UIBarButtonItem
private func createFilteringMenu() -> UIMenu {
let fivePhotos = UIAction( title: "5", image: UIImage(systemName: "photo")) { [weak self] _ in
guard let this = self else { return }
this.fetchImages(limit: 5)
}
let tenPhotos = UIAction( title: "10", image: UIImage(systemName: "photo")) { [weak self] _ in
guard let this = self else { return }
this.fetchImages(limit: 10)
}
let twentyPhotos = UIAction( title: "20", image: UIImage(systemName: "photo")) { [weak self] _ in
guard let this = self else { return }
this.fetchImages(limit: 20)
}
let thirtyPhotos = UIAction( title: "30", image: UIImage(systemName: "photo")) { [weak self] _ in
guard let this = self else { return }
this.fetchImages(limit: 30)
}
let menuActions = [fivePhotos, tenPhotos, twentyPhotos, thirtyPhotos]
let addNewMenu = UIMenu( title: "Select number of photos", children: menuActions)
return addNewMenu
}
我认为这是非常糟糕的(重复代码太多)。我想通过使用 forEach:
来做到这一点 private func createFilteringMenu() -> UIMenu {
let numberOfItems = [5, 10, 15, 20, 25, 30]
var menuActions: [UIAction] = []
numberOfItems.forEach{ index in
if index < numberOfItems.count {
let item = UIAction( title: "\(numberOfItems[index])", image: UIImage(systemName: "photo")) { [weak self] _ in
guard let this = self else { return }
this.fetchImages(limit: numberOfItems[index])
}
menuActions.append(item)
}
}
let addNewMenu = UIMenu( title: "Select number of photos", children: menuActions)
return addNewMenu
}
但当然它只是添加了最后一项 (30),谁能帮我添加所有项目(或类似的东西)。
非常感谢
forEach 给出的是值而不是索引。
因此不需要 if 条件,因为它实际上是在每次迭代中根据数组长度检查值
is 5 < 6 -> true
is 10 < 6 -> false
is 15 < 6 -> false
is 20 < 6 -> false
is 25 < 6 -> false
is 30 < 6 -> false
这就是为什么您的菜单中只显示一项的原因
试试这个,看看它是否能解决您的问题。
private func createFilteringMenu() -> UIMenu {
var menuActions: [UIAction] = []
numberOfItems.forEach{ value in
let item = UIAction( title: "\(value)",
image: UIImage(systemName: "photo"))
{ [weak self] _ in
guard let this = self else { return }
this.fetchImages(limit: value)
}
menuActions.append(item)
}
return UIMenu(title: "Select number of photos",
children: menuActions)
}