首页 > 解决方案 > 在 Swift 中动态更改视图控制器之外的文本元素的属性

问题描述

我是 Swift 和移动开发的新手,最近我一直在尝试创建一段可以在 IOS 应用程序之上独立工作的代码。我的目标是创建一个可以在所有应用程序中操作文本样式的框架。

我坚持的是如何访问和动态更改视图控制器内的文本元素的属性。

是否可以创建一个可以查看视图控制器并动态更改样式的框架?

到目前为止,我已经实现的是使用在视图控制器之外编写的函数来操作字体样式和颜色(计划稍后将其转储到框架中)。

这是我快速学习的第三天,对于任何愚蠢的代码或问题,我深表歉意。我搜索了很多关于如何动态访问视图控制器中的元素但没有找到任何东西..

这是我的代码

//
//  ContentView.swift
//  Swift-UI-Test
//
//  Created by Vikas Nair on 08/05/21.
//

import SwiftUI

struct ContentView: View {
    @StateObject var stateObject = TestObject()

    var body: some View {
        VStack(spacing: 20){
            Text("Vikku Here")
            .foregroundColor(changeBkColor(color: stateObject.color))
                .fontWeight(/*@START_MENU_TOKEN@*/.bold/*@END_MENU_TOKEN@*/)
                .font(.system(size:CGFloat(textsize(text_size: stateObject.font_size)) ))
            Button(action: {
                        
                stateObject.color = 2
                stateObject.font_size = "med"
                        
                    }) {
                Text("Press")
                .frame(width: 60, height: 60)
                .foregroundColor(Color.black)
                .background(Color.blue)
                .clipShape(Circle())
             }.buttonStyle(PlainButtonStyle())
            
            Button(action: {
                        
                stateObject.color = 3
                stateObject.font_size = "big"
                        
                    }) {
                Text("Press")
                .frame(width: 60, height: 60)
                .foregroundColor(Color.black)
                .background(Color.blue)
                .clipShape(Circle())
             }.buttonStyle(PlainButtonStyle())
        
    }
}
}

class TestObject: ObservableObject {
    @Published var color: Int = 1
    @Published var font_size: String = "small"
}

func changeBkColor(color: Int) -> Color
{
    if(color == 1)
    {
        return Color.red;
    }
    else if(color == 2)
    {
        return Color.green;
    }
    else if(color == 3)
    {
        return Color.blue;
    }
    else
    {
        return Color.black;
    }
}


func textsize(text_size: String)-> Float
{
    if(text_size == "big")
    {
        return 60.0;
    }
    else if(text_size == "med")
    {
        return 35.0;
    }
    else if(text_size == "small")
    {
        return 20.0;
    }
    else
    {
        return 10.0;
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

标签: iosswiftswiftui

解决方案


这是我要做的:

  1. 更改@StateObject var stateObject = TestObject()@EnvironmentObject var testObject: TestObject
  2. 摆脱changeBkColor(color:). 你不需要它。
  3. 使TestObjectcolor属性 a Color,像这样:@Published var color: Color = Color.red.
  4. 更改.foregroundColor(changeBkColor(color: stateObject.color)).foregroundColor(testObject.color)
  5. TestObject在您的 中存储对您的引用SceneDelegate,并在您SceneDelegatescene(_:willConnectTo:options:)函数中设置.environmentObject,如下所示:
static let testObject = TestObject()
    

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        let contentView = ContentView()

        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView.environmentObject(SceneDelegate.testObject)) // <-- Here
            self.window = window
            window.makeKeyAndVisible()
        }
    }

然后,只需将TestObject'color属性设置为 aColor即可更改文本的颜色。


推荐阅读