英文:
Apply modifier on if else block
问题
如下所示,我已经在 if
块和 else
块中应用了 frame()
修饰符。
var body: some View {
NavigationView {
if model.mode == .active {
activeList
.frame(minWidth: 200)
} else {
trashedList
.frame(minWidth: 200)
}
}
}
如何去除 frame(minWidth:)
的重复?
更一般地说,是否有一种方法可以在 if else 结果中将修饰符放在一个公共位置?
英文:
As seen in the code below, I have applied frame()
modifier in the if
block and else
block.
var body: some View {
NavigationView {
if model.mode == .active {
activeList
.frame(minWidth: 200)
} else {
trashedList
.frame(minWidth: 200)
}
}
}
How do I remove duplication of frame(minWidth:)
?
More generally, is there a way where outcome of if else can have modifiers at a common place?
答案1
得分: 2
虽然以上所有答案都是正确的,但我的个人观点是像下面这样做。我更喜欢 @paul 的观点,使用一个组可以减少你的视图修饰符的重复。
var body: some View {
NavigationView {
let listView = model.mode == .active ? activeList : trashedList
listView
.frame(minWidth: 200)
}
}
希望对你有帮助!
英文:
Though all of the above answers are correct, my personal opinion is to do something like below. And i prefer the @paul's view having a group can reduce your view modifier's replication.
var body: some View {
NavigationView {
let listView = model.mode == .active ? activeList : trashedList
listView
.frame(minWidth: 200)
}
}
Hope it helps!
答案2
得分: 1
我建议您使用Group
,因为它不会更改您的布局,如下所示:
var body: some View {
NavigationView {
Group {
if model.mode == .active {
activeList
} else {
trashedList
}
}
.frame(minWidth: 200)
}
}
英文:
I can advice you to use Group
as it doesn't change your layout such as :
var body: some View {
NavigationView {
Group {
if model.mode == .active {
activeList
} else {
trashedList
}
}
.frame(minWidth: 200)
}
}
答案3
得分: 0
以下是翻译好的部分:
这是如何定义自己的修饰器的方法:
struct MyDefaultWidthModifier: ViewModifier {
func body(content: Content) -> some View {
return content
.frame(minWidth: 200) // 根据您的需求,您可以将这个值存储为变量
}
}
优雅的用法:
NavigationView {
if model.mode == .active {
activeList
.modifier(MyDefaultWidthModifier())
} else {
trashedList
.modifier(MyDefaultWidthModifier())
}
}
解决方案2:如果您不想每次都编写修饰器,请扩展ListStyle。以下是示例:
struct MyListStyle: ListStyle {
func makeBody(configuration: Configuration) -> some View {
// 这只是扩展了默认的List外观,但您可以返回
List(configuration)
.modifier(MyDefaultWidthModifier()) // 以及其他样式
}
}
extension ListStyle where Self == MyListStyle {
static var myListStyle: MyListStyle { .init() }
}
然后在您的顶级ContentView中添加修饰器:
var body: some View {
NavigationView {
if model.mode == .active {
activeList
} else {
trashedList
}
}.listStyle(.myListStyle)
}
英文:
Here is how you can define your own modifier
struct MyDefaultWidthModifier: ViewModifier {
func body(content: Content) -> some View {
return content
.frame(minWidth: 200) // you can store this as a variable based on your needs
}
}
Elegant Usage:
NavigationView {
if model.mode == .active {
activeList
.modifier(MyDefaultWidthModifier())
} else {
trashedList
.modifier(MyDefaultWidthModifier())
}
}
Solution 2: If you don't want to write the modifier every time, extend the ListStyle. Example below:
struct MyListStyle: ListStyle {
func makeBody(configuration: Configuration) -> some View {
// This just extends the default List appearance, but you can return
List(configuration)
.modifier(MyDefaultWidthModifier()) // Along with whatever other styles you
}
}
extension ListStyle where Self == MyListStyle {
static var myListStyle: MyListStyle { .init() }
}
Then in your top-level ContentView, add the modifier:
var body: some View {
NavigationView {
if model.mode == .active {
activeList
} else {
trashedList
}
}.listStyle(.myListStyle)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论