使用全局数组更新滚动视图

Posted

技术标签:

【中文标题】使用全局数组更新滚动视图【英文标题】:Updating a Scroll View with a global array 【发布时间】:2020-11-26 13:17:22 【问题描述】:

在我的主屏幕上,我有一个滚动视图,我想显示应用内发生的所有事件。目前我已将其定义为全局变量,如下所示:

struct matchEvent: Identifiable
    var id = UUID()
    
    var time: String
    var event: String
    var player: String


var matchEvents = [matchEvent]()

func addEvent(time: String, event: String, player: String)
    matchEvents.append(matchEvent(time: time, event: event, player: player))

函数addEvent() 是从应用程序周围其他类的不同方法内部调用的,因此我将其设为全局。当数组matchEvents 更新时,如何让应用程序更新滚动视图?我已经把我的 ScrollView 代码放在下面了。

struct eventList: View
    var body: some View
        ScrollView(.horizontal)
            HStack(matchEvents)
                ForEach(matchEvents)event in
                    Button(event.event)
                        print("Clicked")
                    
                
            
        
    

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

您可以将matchEvents 包装到类中并使用共享实例来更新/观察它。

这是可能的方法。使用 Xcode 12.1 / ios 14.1 测试

注意:大写的类型要遵循约定

struct MatchEvent: Identifiable
    var id = UUID()
    
    var time: String
    var event: String
    var player: String


class EventsProcessor: ObservableObject 
    static let shared = EventsProcessor()
    
    @Published var matchEvents = [MatchEvent]()
    
    func addEvent(time: String, event: String, player: String)
        matchEvents.append(MatchEvent(time: time, event: event, player: player))
    


struct EventListView: View
    @ObservedObject var processor = EventsProcessor.shared
    
    var body: some View
        ScrollView(.horizontal)
            HStack 
                ForEach(processor.matchEvents)event in
                    Button(event.event)
                        print("Clicked")
                    
                
            
        
    

【讨论】:

以上是关于使用全局数组更新滚动视图的主要内容,如果未能解决你的问题,请参考以下文章

在滚动视图中更改 UIView 而 / 更新滚动视图高度 - Swift 3 / Xcode 8

如何在选择新数组被播放到该滚动视图时,如何删除将放置到滚动视图中的UIBUtonons?

滚动时更新自定义列表视图失败

更新到 watchOS 6 后,滚动视图停止工作,有啥变化吗?

iOS:当用户滚动表格视图时标签停止更新

更新列表视图时如何保持滚动