首页 > 解决方案 > 小部件在 SwiftUI 中显示为空白

问题描述

我正在尝试在 SwiftUI 中构建一个小部件,但是在加载小部件时,它显示的只是一个空白屏幕。作为小部件和 SwiftUI 的新手,我真的不知道我哪里出了问题,有人可以帮忙吗?即使只是尝试Text("Hello World")在正文中打印一个简单的内容也无济于事。我一直在学习本教程 - https://swiftrocks.com/ios-14-widget-tutorial-mini-apps

struct GameProvider: TimelineProvider {
    typealias Entry = GameEntry

    
    func placeholder(in context: Context) -> GameEntry {
        GameEntry(date: Date(), games: nil)
    }
    
    func getSnapshot(in context: Context, completion: @escaping (GameEntry) -> Void) {
        
        let entry = GameEntry(date: Date(), games: nil)
        completion(entry)
    }
    
    func getTimeline(in context: Context, completion: @escaping (Timeline<GameEntry>) -> Void) {
        
        let currentDate = Date()
        let refreshDate = Calendar.current.date(byAdding: .minute, value: 5, to: currentDate)!
        
        self.getLiveGames { resultGames in
            if let games = resultGames {
                let entry = GameEntry(date: currentDate, games: games)
                let timeline = Timeline(entries: [entry], policy: .after(refreshDate))
                completion(timeline)
            }
        }
        
    }
    
    
    func getLiveGames(handler: @escaping (_ games: [LSGame]?) -> ()){
        let request = NSMutableURLRequest(url: SCORESURL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0)
        request.httpMethod = "GET"
        request.allHTTPHeaderFields = headers
        
        URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in
            
            guard let data = data else {return}
            
            data.decoded(as: LSGameResponse.self) { result in
                do {
                    let res = try result.get()
                    
                    guard let games = res.results else {
                        handler(nil)
                        return
                    }
                    
                    if games.count < 1 {
                        handler(nil)
                    }

                    
                    handler(games)
                    
                    
                } catch {
                    handler(nil)
                }
            }
        }.resume()
    }

    
    func getFavoriteTeams() -> [String] {
        if let userDefaults = UserDefaults(suiteName: "group.com.uSTADIUM.uSTADIUM1"){
            let teams = userDefaults.array(forKey: "favoriteTeams") as! [String]
            return teams
        }
        return []
    }

    
    
}

struct GameEntry: TimelineEntry {
    public let date: Date
    public let games: [LSGame]?
}

struct Scores_WidgetEntryView : View {
    var entry: GameProvider.Entry
    
    
    
    var body: some View {
        
        if let games = entry.games {
            VStack {
                ForEach(0..<games.count) { index in
                    Text("Hello")
                }
            }
        } else {
            Text("No games!")
        }
    }
    
    
}


@main
struct Scores_Widget: Widget {
    let kind: String = "Scores_Widget"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: GameProvider()) { entry in
            Scores_WidgetEntryView(entry: entry)
        }
        .configurationDisplayName("My Widget")
        .description("This is an example widget.")
        .supportedFamilies([.systemLarge])
    }
}

struct Scores_Widget_Previews: PreviewProvider {
    static var previews: some View {
        Scores_WidgetEntryView(entry: GameEntry(date: Date(), games: nil))
            .previewContext(WidgetPreviewContext(family: .systemLarge))
    }
}

标签: iosarraysswiftwidget

解决方案


推荐阅读