WatchKit InterfaceController与ViewController

时间:2015-04-18 01:18:48

标签: ios swift watchkit

在功能方面awakeWithContext, willActivate, didDeactivate是否与viewDidLoad, viewWillAppear, viewDidAppear相同?

我正在移植Swift Apple Watch教程中的代码,该教程是在人们不得不添加自己的手表AppViewController文件来测试他们的手表应用程序时创建的。

随着Xcode的官方手表发布,所包含的文件和内容已经发生了变化,所以我想知道放在哪里。

例如,旧的AppViewController文件中有一些代码,因此我只是将其复制/粘贴到新的InterfaceController中。我将viewDidLoad, viewWillAppear, viewDidAppear中的代码分别放入awakeWithContext, willActivate, didDeactivate

似乎方法不同。我得到1个错误,说setText不存在: bpmLabel.setText(currentBeatPattern.bpm) = "\(currentBeatPattern.bpm)"

...和2个错误说视图不存在: iconLabel.frame = self.view.bounds self.view.insertSubview(iconLabel, atIndex: 1)

就像WatchKit不使用某些常规属性方法或其他东西一样。

错误消息: http://i.imgur.com/wXMdt3c.png

override func awakeWithContext(context: AnyObject?) {
    super.awakeWithContext(context)

    self.view.insertSubview(iconLabel, atIndex: 1)  // Xcode error

}

override func willActivate() {
    super.willActivate()

    iconLabel.frame = self.view.bounds  // Xcode error

    iconLabel.textAlignment = .Center
    iconLabel.font = UIFont.boldSystemFontOfSize(132)
}

override func didDeactivate() {
    // This method is called when watch view controller is no longer visible
    super.didDeactivate()

    newBeat()

    NSTimer.scheduledTimerWithTimeInterval(8,
        target: self,
        selector: Selector("newBeat"),
        userInfo: nil,
        repeats: true)

    beat()

}


func newBeat() {
    // 1
    if ++currentBeatPatternIndex == beatPatterns.count {
        currentBeatPatternIndex = 0
    }

    // 2
    currentBeatPattern = beatPatterns[currentBeatPatternIndex]

    // 3
    bpmLabel.setText(currentBeatPattern.bpm) = "\(currentBeatPattern.bpm)"   // Xcode error

    iconLabel.text = currentBeatPattern.icon
}

func beat() {
    // 1
    UIView.animateWithDuration(currentBeatPattern.duration / 2,
        delay: 0.0,
        options: .CurveEaseInOut,
        animations: {
            // 2
            self.iconLabel.transform = CGAffineTransformScale(
                self.iconLabel.transform, self.shrinkFactor, self.shrinkFactor)
        },
        completion: { _ in
            // 3
            UIView.animateWithDuration(self.currentBeatPattern.duration / 2,
                delay: 0.0,
                options: .CurveEaseInOut,
                animations: {
                    // 4
                    self.iconLabel.transform = CGAffineTransformScale(
                        self.iconLabel.transform, self.expandFactor, self.expandFactor)
                },
                completion: { _ in
                    // 5
                    self.beat()
                }
            )
        }
    )
}



}

1 个答案:

答案 0 :(得分:0)

你是对的,awakeWithContext,willActivate和didDeactivate非常类似于现有的UIViewController方法,如viewDidLoad,viewWillAppear和viewDidUnload。但是,您看到的错误与WatchKit目前的工作方式有关。为了运行手表应用程序,所有代码都在iPhone上执行,但Apple Watch本身负责UI元素。这意味着构成您的手表应用程序的任何视图必须包含在您的手表应用程序的故事板上。此外,作为直接结果,视图无法实例化并添加到父视图中。所有UI元素都必须包含在您的监视应用程序的故事板中,并且手表将根据它们在界面构建器中的排列进行布局。这意味着您无法调用addSubview,也无法设置元素的框架。您只能调整其大小并设置其隐藏属性以隐藏或显示在手表上。就这种方法而言 -

 bpmLabel.setText(currentBeatPattern.bpm) = "\(currentBeatPattern.bpm)"

您正在调用该方法错误。在swift中,参数包含在括号中。如果它是你的意思,你可以这样称呼它

bpmLabel.setText("\(currentBeatPattern.bpm)")

但是setText是一个采用字符串参数但不能用=

赋值的方法

就动画而言,我认为你运气不好。观看应用程序当前更像是小工具而不是iOS应用程序,诸如UIView动画和框架数学之类的东西都无法使用。你一定要读 在WatchKit上,因为你无法将iOS应用程序直接移植到这样的手表上。