我只是遇到了一種情況,我想使用一個帶有系結的視圖,該視圖需要一個字串:
struct MyButton: View {
var text: String = ""
var body: some View {
Button{
HStack {
Text(text)
}
}
}
}
我無法讓它在可接受的時間段內作業,所以我只是創建了第二個視圖:
struct MyBoundedButton: View {
@Binding var text: String
var body: some View {
Button{
HStack {
Text(text)
}
}
}
}
這顯然有效,但似乎不是最優雅的解決方案。我試圖弄清楚 SwiftUI 框架是如何做到的,因為有很多視圖示例具有非常不同的初始化程式(例如,請參見 SwiftUI 按鈕)。我仍然想弄清楚這可能是如何作業的,所以下班后我試圖玩通用視圖,但不能真正讓它作業。以下代碼不起作用,只是為了展示我所遵循的思路:
struct MyButton<T>: View {
var text: T
var body: some View {
Button{
HStack {
Text(text)
}
}
}
}
extension MyButton where text == Binding<String>{
init(text: Binding<String>)
}
extension MyButton where text == String{
init(text: String)
}
有人知道如何實作這一點,或者 Apple 如何在他們的 SwiftUI 庫中做到這一點?
干杯,菲利普
uj5u.com熱心網友回復:
這可以通過不同的方式完成......您使用泛型的方法似乎更優雅,但我相信您正在尋找更易于理解的代碼,更簡單:
import SwiftUI
struct MyButton: View {
private var text: Binding<String>?
private var pureText: String?
private var action: () -> Void
init(text: Binding<String>, action: @escaping () -> Void) {
self.action = action
self.text = text
}
init(text: String, action: @escaping () -> Void) {
self.action = action
self.pureText = text
}
var body: some View {
Button(action: action) {
if let text = text {
Text(text.wrappedValue)
}
if let text = pureText {
Text(text)
}
}
}
}
struct ContentView: View {
@State private var text = "Press me"
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundColor(.accentColor)
Text("Hello, world!")
MyButton(text: $text) {
print("Button pressed.")
}
}
}
}
盡管這種情況下的系結沒有多大意義...系結是當您更改變數的值并希望將 UP 傳遞給 ParentView 時,永遠不會更改的 Text(text) 內的系結不會對我來說很有意義,但這就是您使用多個初始化程式的方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/529767.html
標籤:仿制药迅捷
