SwiftUI:如何将初始化程序分配给特定对象?

Posted

技术标签:

【中文标题】SwiftUI:如何将初始化程序分配给特定对象?【英文标题】:SwiftUI: How can I assign my initializer to a specific object? 【发布时间】:2019-11-20 11:00:36 【问题描述】:

我使用UIScrollView.appearance().backgroundColor 来更改我的 ContentView 的背景颜色。但不幸的是,这有副作用,我的ModalView() 的颜色不再正常。

为了解决这个问题,我看到了三种可能的解决方案:

第一个选项是以某种方式将UIScrollView.appearance().backgroundColor = UIColor.red 仅分配给第一个ScrollView

第二种方法是找到另一种方法来更改我的ContentView() 的背景颜色。

第三个选项是将ModalView()中的UIScrollView.appearance().backgroundColor重置为默认设置。 (编辑:我认为现在第三个选项是不可能的

感谢您的每一个回答

import SwiftUI

struct ContentView: View 
    @State private var show_modal: Bool = false

    var body: some View 
        UIScrollView.appearance().backgroundColor = UIColor.red // This how I change the backgroundcolor of this View

        return NavigationView 
            ScrollView  // This ScrollView should be affected by the initializer
                VStack(spacing: 12) 
                    HStack 
                        Text("Only unimportant content")
                        Spacer()
                    
                 .padding(.horizontal).padding(.bottom)
            

            .navigationBarTitle(Text("Header"))
            .navigationBarItems(
                leading:
                Button(action:  self.show_modal = true ) 
                    Image(systemName: "plus")
                        .padding(.all, 10)
                 .sheet(isPresented: self.$show_modal)  ModalView() .padding(.leading, -10)
            )
        
    


struct ModalView: View  // This should not be affected by the initializer
    @Environment(\.presentationMode) var presentationMode
    @State private var name: String = ""

    var body: some View 
        // UIScrollView.appearance().backgroundColor = UIColor.red // If anyone knows the default value, please enter this here

        return NavigationView 
            Form 
                List 
                    TextField("This is a TextField", text: $name)
                
            

            .navigationBarTitle(Text(""), displayMode: .inline)
            .navigationBarBackButtonHidden(true)
            .navigationBarItems(
                leading:
                Button(action:  self.presentationMode.wrappedValue.dismiss() ) 
                    Text("Cancel")
                .padding(.vertical, 5)
            )
        
    

这是我的ModalView(),具有“美丽”的副作用

在这张图片中,你可以看到是什么让我相信第三种选择是不可能的: - 所选文本字段的内部变色 - 自动更正建议也会变色 - 打开深色模式后,情况会变得更糟

【问题讨论】:

那么不要改变UIScrollView的外观。将修饰符应用于特定的ScrollView 但不幸的是,我不知道该怎么做。 只需在 ScrollView() 上使用 .background(Color.red) 修饰符。 【参考方案1】:

只需将背景颜色直接应用到滚动视图即可。

return VStack
    ScrollView  // This ScrollView should be affected by the initializer
        Text("Text 1")
    
        .background(Color.red)
    ScrollView  // This ScrollView should NOT be affected by the initializer
        Text("Text 2")
    

【讨论】:

不,这不是我的问题的解决方案。它可能在上面的示例代码中工作,但正如我之前所说,这是一个大大简化的版本。不幸的是,它在我的实际项目中不起作用。但无论如何感谢您的回答。我对示例代码进行了一些编辑,使其更像我的真实项目。 @MattisSchulte 那么您是否有理由需要使用appearance() API?您仍然可以为单个视图覆盖它。 是的,我需要appearance() API,因为这是在同时使用ScrollViewNavigationView 时更改ContenView(包括导航栏)背景颜色的最简单方法。但是你是对的,我仍然可以为个人视图覆盖它。因此,如果我能找到一种方法将 Appearance API 设置回默认值,我的问题就会得到解决。 只有在 swiftUI 无法达到你想要的效果时才使用外观()。在 swiftUI 中更改 ScrollView 的 backgroundcolor 应该不是问题,因此完全不需要外观() @Mamaessen 很遗憾,在使用ScrollViewNavigationView 时更改背景颜色是一个很大的问题。但如果你想了解更多关于这个话题的信息,here 是个好问题。【参考方案2】:

工作表的默认背景颜色是secondarySystemBackground。

UIScrollView.appearance().backgroundColor = UIColor.secondarySystemBackground

【讨论】:

好的,现在在您编辑问题后,我了解您的问题。 不,如果没有副作用,那也是行不通的。但我已经在问题中添加了对副作用的确切描述。【参考方案3】:

您可以将模态视图指定为特定情况,如下所示:

    UIScrollView.appearance().backgroundColor = UIColor.red //normal 
    UIScrollView.appearance(whenContainedInInstancesOf: [UIPresentationController.self]) .backgroundColor = UIColor.white //modal

如果你想要更好的结果,只需指定 UIScrollView 的子类。

    UIScrollView.appearance().backgroundColor = UIColor.red
    UIScrollView.appearance(whenContainedInInstancesOf: [UIPresentationController.self]).backgroundColor = UIColor.clear
    UITableView.appearance(whenContainedInInstancesOf: [UIPresentationController.self]).backgroundColor = UIColor.secondarySystemBackground

【讨论】:

无论如何都很有趣,但不幸的是,与@Mamaessen的答案存在相同的问题 您仍然可以根据您的期望自定义视图。

以上是关于SwiftUI:如何将初始化程序分配给特定对象?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 如何将@Published 分配给另一个@Published

SwiftUI + Combine:如何将数据分配给带有动画的模型

如何在 Swiftui 中根据彼此初始化 @State 变量?

如何将所有 memberOf 属性分配给 LDAP 中的特定用户

如何将 swiftUI 的图像传递给 UIImage? [关闭]

控制内存分配