ios 如何在SwiftUI中使用self.更改变量< variable>?

tzdcorbm  于 2023-08-08  发布在  iOS
关注(0)|答案(1)|浏览(95)

我是iOS新手,我正在使用一个名为KeyboardKit的第三方软件包来创建一个自定义键盘。然而,我注意到它与我读过的教程略有不同。在我的代码中,我必须使用'self.',否则Xcode会显示警告。我写的代码如下。我面临的问题是我无法使用'self.'来更改变量的值。你能指导我如何做到这一点吗?

import UIKit
import KeyboardKit
import SwiftUI

class KeyboardViewController: KeyboardInputViewController {
    
    @State var text = "init" //the variable
        
    override func viewWillSetupKeyboard() {
        super.viewWillSetupKeyboard()
        
        setup { controller in
            VStack(spacing: 0) {

                    
                Button(self.text){
                    self.text = "changed" //change the variable
                }
                
                Text(self.text) //binding the variable
                    
            }
        }
    }
}

字符串

0md85ypi

0md85ypi1#

首先要注意的是……
SwitUI是一个声明式框架,UIKit是一个命令式框架。
这意味着使用UIKit,我们手动告诉它何时显示新数据,SwiftUI通过非常严格的协议自己计算何时显示新数据。
当它们之间的接口,你必须考虑到这两个框架,并发挥与两者的规则。
SwiftUI使用DynamicProperty来识别何时重绘,这些DynamicProperty是以“属性 Package 器”的形式存在的。
大多数SwiftUI Package 器必须位于iOS 13-16中的SwiftUI View中,有两个例外(iOS 17有更多),最相关的是@Published,它是Combine属性 Package 器,因此您可以将其用作发布者,并且它还触发SwiftUI重新加载。
这里是一个基本的设置,我还没有测试代码,所以可能会有错别字。

import UIKit
import KeyboardKit
import SwiftUI

class KeyboardViewController: KeyboardInputViewController {
    
    let sharedSource: SharedSource = .init() //Shared source of truth that works with UIKit and SwiftUI
        
    override func viewWillSetupKeyboard() {
        super.viewWillSetupKeyboard()
        
        setup { controller in
            SubView(sharedSource: sharedSource) // You can use property wrappers inside a `View`.
        }
    }
}

//Shared Source
class SharedSourve: ObservableObject {
    @Published var text: String = "init" // Can subscribe to it with UIKit via Combine's `sink` or make changes with any of the available methods.

}

struct SubView: View {
    @ObservedObject var sharedSource: SharedSource //Has the ability to tell SwiftUI to redraw.
    //You can also use `@State` here like you had in your original code if you dont need a shared source.
    var body: some View {
        VStack(spacing: 0) {                        
                Button(sharedSource.text){
                    sharedSource.text = "changed" //change the variable
                }
                
                Text(sharedSource.text) 
                    
            }

    }

}

字符串

相关问题