基于页面的界面使用多个相同的视图控制器
Page based interface use multiple of the same viewcontrollers
我想在 WatchKit 中创建一个基于页面的界面。
docs 声明必须创建多个界面控制器,link 它们才能创建基于页面的界面。
假设我有几个对象,我想为每个对象在手表上显示信息。然后我想使用基于页面的导航来滑动到下一个项目。所有项目都使用相同的界面控制器,只是数据不同。
有什么办法可以实现吗?
假设您为每个页面关联了相同的 InterfaceController,要将不同的数据传递给每个页面,请遵循以下步骤:
- 创建一个初始视图控制器,它会像飞溅一样
您的应用的屏幕。
- 在初始视图控制器的 "willActivate" 中,创建一个数组
页面和一组包含您需要传递的数据的上下文
到每个页面(interfaceViewControllers)。
- 调用WKInterfaceController.reloadRootControllersWithNames(页数,
上下文:pageContexts).
- 在 "awakeWithContext" 的每个公共 InterfaceController 中
页面,阅读上下文并初始化 properties/data.
点号3 基本上保证了你的页面显示的时候就像直接启动一样。您的另一个选择是使用 self.presentControllerWithNames,但这会在左上角显示一个 "Cancel" 按钮。
示例代码:
在 SplashScreen 界面控制器中
override func willActivate() {
super.willActivate()
let pages = ["page1","page2","page3","page4"]
let pageContexts = [["data1":0,"data2":0],["data1":38,"data2":1],["data1":49,"data2":1],["data1":74,"data2":2]]
WKInterfaceController.reloadRootControllersWithNames(pages, contexts: pageContexts)
}
在页面界面控制器中
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
if let contextDict:Dictionary = context as Dictionary<String,AnyObject>!
{
data1 = contextDict["data1"] as Int
data2 = contextDict["data2"] as NSTimeInterval
}
}
如果您没有像下面这样定义静态,将 reloadRootControllersWithNames 放在 willActivate 中会导致无限循环。
static BOOL first = YES;
- (void)willActivate {
// This method is called when watch view controller is about to be visible to user
[super willActivate];
if (first) {
[WKInterfaceController reloadRootControllersWithNames:[NSArray arrayWithObjects:@"SinglePageICIdentifier",@"SinglePageICIdentifier", nil] contexts:[NSArray arrayWithObjects:@"First",@"Second", nil]];
first = NO;
}
}
我想在 WatchKit 中创建一个基于页面的界面。
docs 声明必须创建多个界面控制器,link 它们才能创建基于页面的界面。
假设我有几个对象,我想为每个对象在手表上显示信息。然后我想使用基于页面的导航来滑动到下一个项目。所有项目都使用相同的界面控制器,只是数据不同。
有什么办法可以实现吗?
假设您为每个页面关联了相同的 InterfaceController,要将不同的数据传递给每个页面,请遵循以下步骤:
- 创建一个初始视图控制器,它会像飞溅一样 您的应用的屏幕。
- 在初始视图控制器的 "willActivate" 中,创建一个数组 页面和一组包含您需要传递的数据的上下文 到每个页面(interfaceViewControllers)。
- 调用WKInterfaceController.reloadRootControllersWithNames(页数, 上下文:pageContexts).
- 在 "awakeWithContext" 的每个公共 InterfaceController 中 页面,阅读上下文并初始化 properties/data.
点号3 基本上保证了你的页面显示的时候就像直接启动一样。您的另一个选择是使用 self.presentControllerWithNames,但这会在左上角显示一个 "Cancel" 按钮。
示例代码: 在 SplashScreen 界面控制器中
override func willActivate() {
super.willActivate()
let pages = ["page1","page2","page3","page4"]
let pageContexts = [["data1":0,"data2":0],["data1":38,"data2":1],["data1":49,"data2":1],["data1":74,"data2":2]]
WKInterfaceController.reloadRootControllersWithNames(pages, contexts: pageContexts)
}
在页面界面控制器中
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
if let contextDict:Dictionary = context as Dictionary<String,AnyObject>!
{
data1 = contextDict["data1"] as Int
data2 = contextDict["data2"] as NSTimeInterval
}
}
如果您没有像下面这样定义静态,将 reloadRootControllersWithNames 放在 willActivate 中会导致无限循环。
static BOOL first = YES;
- (void)willActivate {
// This method is called when watch view controller is about to be visible to user
[super willActivate];
if (first) {
[WKInterfaceController reloadRootControllersWithNames:[NSArray arrayWithObjects:@"SinglePageICIdentifier",@"SinglePageICIdentifier", nil] contexts:[NSArray arrayWithObjects:@"First",@"Second", nil]];
first = NO;
}
}