我正在尝试制作一个菜单,其中填充了特定字体的字体样式。在下面的代码中,我有一项尝试已被注释掉。下面的代码正确打印样式,但我无法让 ForEach() 工作。 GetFontStyles() 接缝返回一个数组数组,该内部数组包含多个字段,包括字体名称、字体样式和一些 ID 号。注意用于拉取样式的成员[1]。
struct AddFontStyleItems: View {
var dm: DrawModel
init(_ dm: DrawModel ) { self.dm = dm }
var body: some View {
var fontStyles = getFontStyles(for: dm.curFont )
// ForEach(fontStyles, id: \.self) { curStyle in
// Button( "xxx" ) {
// print( "Style: \(curStyle)")
// // print("Type of Member: \(type(of: member)) - \(member[1])")
// }
// }
Button( "xxx" ) {
let fontStyles = NSFontManager.shared.availableMembers(ofFontFamily: dm.curFont)
print("-\nFont: \(dm.curFont)")
if let members = fontStyles {
for member in members {
print("Style for: \(dm.curFont) - \(member[1])")
}
}
}
}
}
func getFontStyles(for fontFamily: String) -> [String] {
let fontManager = NSFontManager.shared
guard let availableMembers = fontManager.availableMembers(ofFontFamily: fontFamily) else {
return []
}
return availableMembers.compactMap { member in
return member as? String
}
}
您可以使用助手来尝试这种方法
struct FontModel
保存字体结果并使其更容易在 ForEach
循环中使用。
struct ContentView: View {
var body: some View {
AddFontStyleItems(DrawModel(curFont: "Helvetica"))
}
}
// for testing
struct DrawModel {
var curFont: String
}
struct FontModel: Identifiable { // <--- here
let id = UUID()
var fontType: String
var fontName: String
var fontWeight: Int
var fontTrait: Int
init(_ arr: [Any]) {
if arr.count < 5 {
self.fontType = arr[0] as! String
self.fontName = arr[1] as! String
self.fontWeight = arr[2] as! Int
self.fontTrait = arr[3] as! Int
} else {
self.fontType = ""
self.fontName = ""
self.fontWeight = 0
self.fontTrait = 0
}
}
}
struct AddFontStyleItems: View {
var dm: DrawModel
@State private var fontStyles: [FontModel] = [] // <--- here
init(_ dm: DrawModel) { self.dm = dm }
var body: some View {
ForEach(fontStyles) { curStyle in // <--- here
Button(curStyle.fontName) {
print("---> Style: \(curStyle)")
}
}
.onAppear {
fontStyles = getFontStyles(for: dm.curFont) // <--- here
}
}
func getFontStyles(for fontFamily: String) -> [FontModel] {
var results: [FontModel] = []
if let members = NSFontManager.shared.availableMembers(ofFontFamily: dm.curFont) {
for member in members {
results.append(FontModel(member))
}
}
return results
}
}