ios - 在 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()
}
}
解决方案
这是我要做的:
- 更改
@StateObject var stateObject = TestObject()
为@EnvironmentObject var testObject: TestObject
。 - 摆脱
changeBkColor(color:)
. 你不需要它。 - 使
TestObject
的color
属性 aColor
,像这样:@Published var color: Color = Color.red
. - 更改
.foregroundColor(changeBkColor(color: stateObject.color))
为.foregroundColor(testObject.color)
。 TestObject
在您的 中存储对您的引用SceneDelegate
,并在您SceneDelegate
的scene(_: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
即可更改文本的颜色。
推荐阅读
- amazon-web-services - 地图资源的 Terraform 导入
- flutter - 如何从异步函数中获取价值并在 UI 中更新任何更改?
- javascript - 在 ThreeJS 中首次添加几何
- zapier - 为空时替换一个值(ZAPIER - Javascript)
- css - 使用 CSS 将 AgGrid 控件的组标题中的文本垂直居中?
- applescript - 如何重命名启动盘?
- reactjs - Firebase v9 onAuthStateChanged 仅在初始化时触发
- ios - React-Native xcrun:错误:无法在 Xcode 13 中找到“仪器”
- amazon-web-services - AWS Media Convert 1401 错误:在 S3 存储桶上启用“阻止此账户的公共访问设置”时的授权错误
- java - java.lang.UnsupportedOperationException:com.my.project.dialect.CustomH2Dialect 不支持通过存储过程的结果集