使用基于页面的导航在watchkit中将数组数据从一个接口传递到另一个接口?

时间:2015-01-27 12:49:20

标签: ios objective-c uinavigationcontroller watchkit

我正在研究Apple手表。我尝试使用InterfaceController中的PageBasedNavigation将数组数据从一个watch-kit传递到另一个watch-kit。那么,任何人都可以建议我如何在编程方式下在{{1}}中滑动表单时传递数组吗?

对于创建基于页面的界面,请按照以下步骤操作:

  1. 在我的故事板中,为界面中的每个页面添加界面控制器。

  2. 按住Control键并单击应用程序的主界面控制器并拖动到另一个界面控制器。

  3. 第二个接口控制器应突出显示,表示可以进行segue。

  4. 释放鼠标按钮。

  5. 从关系segue面板中选择下一页。

  6. 使用相同的技术,从每个接口控制器创建segue到下一个。

3 个答案:

答案 0 :(得分:5)

将对象传递给基于页面的WKInterfaceController的WatchKit方法与iOS不同。虽然您将在Storyboard上看到关系segue,但当您单击它时,没有选项可以命名此segue(这是在iOS中使用prepareForSegue:方法的第一步)。

相反,你要做的是传递一个包含" context"的数组。对象,其中一个将提供给管理页面的每个WKViewController。在Objective-C中:

+ (void)reloadRootControllersWithNames:(NSArray *)names
                          contexts:(NSArray *)contexts

在斯威夫特:

class func reloadRootControllersWithNames(_ names: [AnyObject]!,
                             contexts contexts: [AnyObject]!)

如果您想要从一个对象传递到另一个对象,则将该对象设置为每个页面的上下文:

NSArray * namesArray = @[@"Page 1", @"Page 2", @"Page 3"];
NSArray * contextsArray = @[myObject, myObject, myObject];
[self reloadRootControllersWithNames:namesArray contexts:contextsArray];

从方法名称有点违反直觉,虽然此方法称为reloadRootControllersWithNames:,但WatchKit documentation on Managing Page-Based Navigation表示应该使用相同的方法在启动时以及任何时间对这些值进行种子设定您想在运行时重新加载此数据。

答案 1 :(得分:1)

我不再使用Object-C,但我认为对象C是相似的。我现在正在使用swift。使用Swift,您可以创建一个新的singleTon.swift文件并将其放在其中:

//
//  singleTon.swift
//  testSingleTon
//
//  Created by Standard on 1/14/15.
//  Copyright (c) 2015 Standard. All rights reserved.
//

import UIKit

class singleTon: NSObject {
    class var sharedInstance : singleTon {
        struct Example {
            static let instance = singleTon()
        }
        return Example.instance
    }

    var number = 0
    var array = []

}

之后,您可以将数据共享到应用程序的所有界面。例如,您可以更改第一个InterfaceController中的数据,如下所示:

 override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()
        NSLog("%@ will activate", self)



        singleTon.sharedInstance.array = ["new"]


    }

你可以像这样在SecondInterface中更改或获取shareInstance:

override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()
        NSLog("%@ will activate", self)


        println("share data: \(singleTon.sharedInstance.array)") // It's will show up the ["new"] here


    }

答案 2 :(得分:0)

NSUserDefaults可以在接口控制器之间使用。