You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置含CPMapTemplate的CPTabBarTemplate为根模板时CarPlay应用崩溃

崩溃原因及解决方案

崩溃原因

从抛出的异常信息可直接确定原因:CPMapTemplate 不允许作为 CPTabBarTemplate 的子模板。
Apple 在 CPTabBarTemplate 的validateTemplates:方法中严格限定了可作为子模板的类型,仅允许以下4种:

  • CPInformationTemplate
  • CPPointOfInterestTemplate
  • CPGridTemplate
  • CPListTemplate
    你的代码将CPMapTemplate加入到CPTabBarTemplate的模板数组中,违反了该规则,直接触发崩溃。

实现目标界面的正确方式

若要实现包含地图和列表标签的CarPlay界面,不能将CPMapTemplate放入CPTabBarTemplate,可采用以下两种方案:

方案1:以地图为根模板,通过按钮跳转列表

将CPMapTemplate设为应用根模板,在地图模板的导航栏添加按钮,点击后导航到CPListTemplate:

let mapTemplate = CPMapTemplate()
// 创建列表模板
let listSection = CPListSection(items: [CPListItem(text: "Title", detailText: "description")])
let listTemplate = CPListTemplate(title: "List", sections: [listSection])
// 创建跳转按钮
let listButton = CPBarButton(image: UIImage(systemName: "list.bullet"), handler: { [weak self] _ in
    self?.interfaceController?.pushTemplate(listTemplate, animated: true)
})
// 将按钮添加到地图模板的导航栏
mapTemplate.trailingNavigationBarButtons = [listButton]

// 设置地图模板为根模板
self.interfaceController?.setRootTemplate(mapTemplate, animated: true, completion: nil)

方案2:使用POI模板替代地图模板放入标签栏

若坚持使用标签栏结构,可使用CPPointOfInterestTemplate(允许放入CPTabBarTemplate)来实现地图相关功能,该模板可展示地图上的兴趣点,符合标签栏的使用规则:

// 创建POI模板(关联地图功能)
let poiTemplate = CPPointOfInterestTemplate(poiCategories: [.restaurant])
poiTemplate.tabTitle = "Map"

// 创建列表模板
let listSection = CPListSection(items: [CPListItem(text: "Title", detailText: "description")])
let listTemplate = CPListTemplate(title: "List", sections: [listSection])
listTemplate.tabTitle = "List"

// 创建标签栏模板并设置为根
let tabBarTemplate = CPTabBarTemplate(templates: [poiTemplate, listTemplate])
self.interfaceController?.setRootTemplate(tabBarTemplate, animated: true, completion: nil)

内容的提问来源于stack exchange,提问作者Taras

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:16:30