Xea*_*aza 11 ios carplay swift
根据苹果的文档,应该显示一个活动指示器来指示某些内容正在加载或需要一些时间才能在屏幕上显示。这是合理的,我很乐意这样做......

我觉得我错过了一些明显的东西,但我无法弄清楚如何在 CarPlay 应用程序模板中显示活动指示器,因为我无权访问该视图。我只能与可用的模板进行交互。
如果我试图匹配苹果文档中的图像,我会假设我需要使用listTemplate以及如何向其中添加活动指示器。
还有其他人遇到过这个吗?任何帮助,将不胜感激!
我在 WWDC21 期间提出了这个问题并得到了以下答复。
如果您使用CPListTemplate,系统将-[CPListItem handler]在用户点击列表项时调用您的。系统为您的处理程序提供了一个完成块,您应该确保在应用程序完成处理用户的选择后调用该完成块。如果您的应用程序没有立即调用完成块,也没关系!也许您的应用程序需要执行需要一些时间的网络请求。如果尚未调用完成块,系统将在短暂延迟后自动将微调器添加到列表项。
另一种选择可能是提供一个包含单个列表项的列表模板,该列表项指示其余项目仍在加载/正在进行中。
特别是对于选项卡栏模板,您可以在呈现后更新显示的选项卡。例如,如果绝对无法在应用程序启动时立即显示一个或多个选项卡,您可以动态添加它们。
或者,对于全屏演示,您可以呈现 来CPAlertTemplate指示应用程序中的错误或加载状态。
小智 2
我遇到了与您相同的问题 - 我无法找到如何在从 API 异步加载内容时显示加载微调器。苹果文档对于解决这个问题并没有多大帮助。经过大量测试,特别是在汽车中的真实 CarPlay 设备上进行测试后,我有了答案。
对我来说,当在 MPPlayableContentDataSource 的 beginLoadingChildItems() 中请求数据时,如果我几秒钟内没有调用 beginLoadingChildItems() 的完成处理程序,则 CarPlay 屏幕上会显示一个加载微调器。因此,CarPlay 调用 beginLoadingChildItems(),我发出 API 请求,并且仅当请求返回数据(或失败)时,我才会调用 beginLoadingChildItems() 的完成处理程序。大多数情况下,API 请求返回得非常快,并且不会显示加载微调器。但是,当 API 速度较慢时(由于连接不稳定而需要几秒钟),则会显示加载微调器。
我的 MPPlayableContentDataSource beginLoadingChildItems() 看起来像:
class CarPlayContentManager: NSObject, MPPlayableContentDataSource {
private let contentProvider = ContentProvider()
func beginLoadingChildItems(at indexPath: IndexPath, completionHandler: @escaping (Error?) -> Void) {
// Make a request to fetch data from the API, passing in completionHandler
contentProvider.fetchContentItems(completionHandler: completionHandler)
}
}
Run Code Online (Sandbox Code Playgroud)
ContentProvider 只是一个获取数据的辅助类:
class ContentProvider {
func fetchContentItems(completionHandler: @escaping (Error?) -> Void) {
// Make the async API request
// When the API request returns (either as success or error) call completionHandler(nil)
}
}
Run Code Online (Sandbox Code Playgroud)
注意:您可以通过在 beginLoadingChildItems() 中设置延迟来测试加载微调器。当调用 beginLoadingChildItems() 时,只需设置 5 秒的延迟,然后在 5 秒结束后调用completionHandler(nil)。这应该会在 CarPlay 屏幕上显示加载微调器。