ios - SwiftUI 如何在 UIBarButtonItem 上添加操作?
问题描述
我正在使用 SwiftUI,并且在 NavigationBar 中添加了 Button,但我无法在该按钮上设置操作。我尝试了这两种方法,但都失败了。
方法:1
.navigationBarTitle("\(task.label)")
.navigationBarItems(trailing: UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(self.actionName)))
但是我在这里遇到了这个错误
参数类型“UIBarButtonItem”不符合预期类型“视图”
方法:2
.navigationBarTitle("\(task.label)")
.navigationBarItems(trailing: NavigationBarButtonItem())
struct NavigationBarButtonItem : View {
var body : some View {
Button(action: {
print("Button Tapped")
}, label: {Text("Done")})
}
}
在这里,这个打印语句永远不会运行,虽然按钮“完成”显示在导航栏的右侧,但操作永远不会起作用。
解决方案
.navigationBarItems(尾随:UIBarButtonItem(...
以上绝对是不正确的-您尝试传递 UIKit 对象而不是预期的 View 结构
以下绝对有效(使用 Xcode 11.2+ 测试)
NavigationView {
// ... some view is here
.navigationBarItems(trailing: Button("Done") {
print("Done something")
})
}
好吧,“按原样”复制粘贴方法 2中的代码也可以,所以可能原因不在此代码中。
它没有提供你所有的代码,但我可以假设你把它放在外面 NavigationView
,但是 doc 说:
/// This modifier only takes effect when this view is inside of and visible /// within a `NavigationView`.
推荐阅读
- pdf - 在 Pandoc 中将 docx 转换为 pdf 时如何保持样式?
- c# - 能否达到这种双精度舍入误差条件?
- razor - 如何将我的 html 中的对象注入到 jsRender 模板中
- c# - 选择提示后如何到达下一个瀑布?
- asp.net-mvc - Kendo Grid 层次结构 - 将行 ID 传递给嵌套网格
- python - OBD2 马自达 3 车门代码
- f# - 在 Visual Studio 代码中安装 F#
- oracle - Symfony 2.8 - Oracle:ManyToMany 返回列 id 必须映射到类中的字段
- .htaccess - .htaccess:将一些子页面重定向到新的子页面,所有其他的重定向到新的主页面
- ansible - 用于检查服务的 ansible 命令