我觉得这是一个已经在某个地方被问过的问题,但我找不到太多相关内容。
当使用变量来更新 UI 时,我们何时/为什么要@State
在视图中使用而不是使用@Published
在 ViewModel 中使用?
这是我试图掌握 MVVM 架构的背景。我总体上理解这种差异,只是当涉及到两者都可以轻松以相同方式完成的事情时。
下面,我有 2 个示例执行相同的操作,但其中一个使用ViewModel,而@State
另一个则使用@Published
ViewModel。一种方法是否比另一种更好(用于更新 UI 目的?)
@State
例子:
struct MyView: View {
@State var backgroundIsRed = false
var body: some View {
ZStack {
if backgroundIsRed {
Color.red
} else {
Color.green
}
}
.onTapGesture { backgroundIsRed.toggle() }
}
}
Run Code Online (Sandbox Code Playgroud)
@Published
例子:
class ViewModel: ObservableObject {
@Published var backgroundIsRed = false
}
struct MyView: View {
@StateObject var viewModel = ViewModel()
var body: some …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 SwiftUI 中设置覆盖层的不透明度。但是,我只是想更改叠加层的不透明度,并希望保持正在叠加的符号的不透明度。但是,当我应用 .opacity() 修饰符时,它会更改整个视图(图像和叠加层)的不透明度
Image(systemName: "magnifyingglass")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 20, height: 20)
.padding(10)
.overlay(Color.gray)
.opacity(0.1)
.clipShape(Circle())
Run Code Online (Sandbox Code Playgroud)
这段代码产生这个视图。
如您所见,整个视图几乎不可见,我试图仅使搜索图标周围的灰色圆圈不透明,并保持搜索图标本身的不透明度。
Swift 初学者在这里...在实例化期间将值传递到结构体实例时,有没有办法省略参数名称?我在 Swift 文档中找不到任何内容。
struct Dog {
var _ name: String
}
var buddy = Dog("Buddy")
Run Code Online (Sandbox Code Playgroud)
显然这是行不通的。在函数中,您可以在参数名称之前使用下划线以在调用期间省略它,这对于结构是否可以以某种方式实现?