设置含CPMapTemplate的CPTabBarTemplate为根模板时CarPlay应用崩溃
崩溃原因及解决方案
崩溃原因
从抛出的异常信息可直接确定原因:CPMapTemplate 不允许作为 CPTabBarTemplate 的子模板。
Apple 在 CPTabBarTemplate 的validateTemplates:方法中严格限定了可作为子模板的类型,仅允许以下4种:
CPInformationTemplateCPPointOfInterestTemplateCPGridTemplateCPListTemplate
你的代码将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
相关产品推荐
相关产品推荐

