我有一個 SwiftUI 應用程式,它通過傳入的視圖、方法和變數呼叫視圖。這個視圖,讓我們稱之為DisplayView
足夠通用,我可以用不同的方式來呼叫它,并讓它顯示真正不同的東西。這很好用,但我最近搬到Display View
了它自己的包,現在我無法呼叫它。
為了創建一個簡單的示例,我啟動了一個新應用程式并創建了一個通用視圖來顯示我如何呼叫它。這有效。
// Shared Display View
public struct DisplayView<Content: View>: View {
// The view we need to display
let content: Content
// The methods that need to be executed
var aMethod: () -> Void
// Boolean
@Binding var aBoundVariable:Bool
// Regular Variable
var aName:String
public var body: some View {
content
#if os(macOS)
.padding()
#endif
}
}
結果:
當我將它移到DisplayView
它自己的包并匯入它時,我在呼叫它時遇到了問題。
首先新形成的DisplayView
現在看起來像:
import SwiftUI
// Shared Display View for all the Core Data display views
public struct DisplayView<Content: View>: View {
// The view we need to display
let content: Content
// The methods that need to be executed
var aMethod: () -> Void
// Boolean
@Binding var aBoundVariable:Bool
// Regular Variable
var aName:String
public init(content: any View, aMethod: @escaping () -> Void, aBoundVariable: Binding<Bool>, aName: String) {
self.content = content as! Content
self.aMethod = aMethod
_aBoundVariable = aBoundVariable
self.aName = aName
}
public var body: some View {
content
#if os(macOS)
.padding()
#endif
}
}
然后我提交、標記等我的包并將其匯入到顯示的第一個應用程式中。我注釋掉了舊DisplayView
代碼,匯入了我的包,并嘗試呼叫新的DisplayView
.
代碼:
import SwiftUI
import thePackage
struct ContentView: View {
@State var aVariable: Bool = false
let aName = "hey"
var body: some View {
DisplayView(content: displayText(), aMethod: randomMethod, aBoundVariable: $aVariable, aName: aName)
}
private func randomMethod() {
print("random method")
}
@ViewBuilder
func displayText() -> some View {
Text("Hello World!")
}
}
//// Shared Display View --> Now using imported package
//public struct DisplayView<Content: View>: View {
// ...
//}
像以前一樣呼叫方法會得到這個錯誤:Generic parameter 'Content' could not be inferred
或影像:
當我點擊修復時,我看到一個占位符
DisplayView<<#Content: View#>>(content: displayText(), aMethod: randomMethod, aBoundVariable: $aVariable, aName: aName)
但無法弄清楚如何正確使用它。我已經嘗試了各種迭代,包括:
根據我在網上看到的其他問題查看
一些 View
和 @ViewBuilder。
我很想切換DisplayView
到一個包中,這樣我就可以在幾個專案中使用它,但是當它是一個包時,我不知道如何正確呼叫它。
提前感謝您的幫助。:)
uj5u.com熱心網友回復:
你需要改變你init
的采取Content
而不是any View
它應該作業。
import SwiftUI
// Shared Display View for all the Core Data display views
public struct DisplayView<Content: View>: View {
// The view we need to display
let content: Content
// The methods that need to be executed
var aMethod: () -> Void
// Boolean
@Binding var aBoundVariable:Bool
// Regular Variable
var aName:String
public init(content: Content, aMethod: @escaping () -> Void, aBoundVariable: Binding<Bool>, aName: String) {
self.content = content
self.aMethod = aMethod
_aBoundVariable = aBoundVariable
self.aName = aName
}
public var body: some View {
content
#if os(macOS)
.padding()
#endif
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/507549.html
下一篇:使用未知鍵快速解碼JSON