使用reloadRootPageControllers如何向多个InterfaceController传递上下文?
解决reloadRootPageControllers向所有页面控制器传递上下文的问题
这个问题我之前也碰到过,核心问题出在reloadRootPageControllers的contexts参数用法上!你现在的代码应该是只传递了单个上下文对象,但这个方法要求上下文数组的长度必须和控制器名称数组的长度完全匹配,每个索引位置的上下文对应同索引的控制器。
正确实现步骤:
- 先准备好你要传递的上下文字典
- 创建一个和控制器数量一致的上下文数组(如果所有控制器需要相同的上下文,直接重复即可)
- 在调用方法时,将这个数组传入
contexts参数
完整代码示例:
// 准备通用的上下文字典 let contextDictionary = [ "workoutConfiguration": workoutConfiguration, "ActivityType": selectedActivityType, "workoutManager": workoutManager ] as [String: Any] // 创建和控制器数量匹配的上下文数组(这里是4个控制器,所以数组长度为4) let contexts = Array(repeating: contextDictionary, count: 4) // 调用重载方法,传入完整的控制器名称数组和上下文数组 WKInterfaceController.reloadRootPageControllers( withNames: [ "WorkoutControlsInterfaceController", "MainDashboardInterfaceController", "YourThirdControllerName", "YourFourthControllerName" ], contexts: contexts, orientation: .horizontal, // 根据你的需求设置方向 pageIndex: 0 // 默认显示的页面索引 )
为什么之前只有第一个控制器能收到上下文?
reloadRootPageControllers的contexts参数是[Any?]?类型:
- 如果不传
contexts或者传入的数组长度小于控制器数量,只有索引匹配的控制器能拿到上下文,其余的会收到nil - 只有当
contexts数组的长度和withNames数组的长度完全一致时,每个控制器才能对应拿到自己的上下文
扩展:给不同控制器传递不同上下文
如果每个控制器需要的上下文不一样,只需要在contexts数组中对应位置放入不同的对象即可:
let contextForController1 = ["key1": value1] let contextForController2 = ["key2": value2] let contextForController3 = ["key3": value3] let contextForController4 = ["key4": value4] let contexts = [contextForController1, contextForController2, contextForController3, contextForController4]
控制器中接收上下文
最后在每个InterfaceController的awake(withContext:)方法中处理上下文:
override func awake(withContext context: Any?) { super.awake(withContext: context) guard let contextDict = context as? [String: Any] else { return } // 提取需要的参数 if let workoutConfig = contextDict["workoutConfiguration"] as? WorkoutConfiguration { // 处理训练配置 } if let activityType = contextDict["ActivityType"] as? ActivityType { // 处理活动类型 } if let workoutManager = contextDict["workoutManager"] as? WorkoutManager { // 处理训练管理器 } }
内容的提问来源于stack exchange,提问作者GarySabo
相关产品推荐
相关产品推荐

