Как получить значки / символы в TableColumn с помощью SwiftUI с MacOS 12.0 Monterey

Только что установили OSX 12 Beta и Xcode 13 Beta, и время сборки сократилось с секунд до минут. Превью почти не работает. Я пытаюсь заставить новый элемент Table и TableColumn SwiftUI работать в Mac OS 12, как в разговоре WWDC2021:

Видео
WWDC2021 wwdcnotes.com
github.com

Видите значки слева? Вот чего я хочу добиться:

Код в WWDC, но ради Бога я не могу понять, что такое CharacterIcon? Вид? Этикетка?

      struct ContentView: View {
  @State private var characters = StoryCharacter.previewData

  var body: some View {
  Table(characters) {
    TableColumn("􀟈") { CharacterIcon($0) }
    .width(20)
    TableColumn("Villain") { Text($0.isVillain ? "Villain" : "Hero") }
    .width(40)
    TableColumn("Name", value: \.name)
    TableColumn("Powers", value: \.powers)
  }
  }
}

Я думаю:

      TableColumn("Icon") { Label("Favorite", systemImage: "star" )}

Но все, что я получаю, это предварительный просмотр, который не строится с этой ошибкой: TimeoutError: Timed out waiting for a thunk to build after 30.0 seconds.

1 ответ

Apple не предоставила образец кода для этого конкретного видео. Иногда вы можете найти кусочки и фрагменты в других видео.

Если бы я догадался, это выглядит примерно так

      struct CharacterIcon: View {
    let character: StoryCharacter
    init(_ character: StoryCharacter){
        self.character = character
    }
    
    var body: some View {
        VStack{
            switch character.isVillain{
            case true:
                RoundedRectangle(cornerRadius: 5)
            case false:
                Circle()
                
            }
        }.foregroundColor(character.color)
            .overlay(
                GeometryReader{ geo in
                    Image(systemName: character.systemImageName)
                        .resizable()
                        .font(.body)
                        //This kind of padding will work better for different sizes
                        .padding(geo.size.width/5)
                        .foregroundColor(.white)
                }
            )
            .aspectRatio(1, contentMode: .fit)
    }
}

Другие вопросы по тегам