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

Pass array data from one interface to another in watchkit using pagebased navigation?

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

为了创建基于页面的界面,我遵循以下步骤:

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

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

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

  4. 松开鼠标按钮。

  5. Select 关系转折面板的下一页。

使用相同的技术,创建从每个界面控制器到下一个界面控制器的转场。

我不再使用 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


    }

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

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

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

在Swift中:

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 表示应使用相同的方法在启动时为这些值设定种子,以及任何时候你想在运行时重新加载这些数据。

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