Swift 获取WatchOS数字皇冠值

Swift 获取WatchOS数字皇冠值,swift,watchkit,Swift,Watchkit,我一直在做一些关于制作苹果手表应用程序的研究,但是我在获取数字皇冠的价值方面遇到了一些困难。我看了一下WKRownSequencer,但不知道该怎么处理它。有人能告诉我如何得到一个值为1-10的变量,当你打开数字皇冠时,它会发生变化。谢谢 在WatchOS3之后,可以获取数字皇冠的价值。检查 基本上,您需要在视图控制器中使用。示例代码如下所示: - (void)willActivate { [super willActivate]; self.crownSequencer.del

我一直在做一些关于制作苹果手表应用程序的研究,但是我在获取数字皇冠的价值方面遇到了一些困难。我看了一下WKRownSequencer,但不知道该怎么处理它。有人能告诉我如何得到一个值为1-10的变量,当你打开数字皇冠时,它会发生变化。谢谢

在WatchOS3之后,可以获取数字皇冠的价值。检查

基本上,您需要在视图控制器中使用。示例代码如下所示:

- (void)willActivate {
    [super willActivate];
    self.crownSequencer.delegate = self;
    [self.crownSequencer focus];
}

- (void)crownDidRotate:(WKCrownSequencer *)crownSequencer rotationalDelta:(double)rotationalDelta {
    self.totalDelta = self.totalDelta + rotationalDelta;
    [self updateLabel];
}

- (void)updateLabel {
    [self.label setText:[NSString stringWithFormat:@"%f", self.totalDelta]];
}
什么是旋转三角形 值为1.0表示冠部已完成完全旋转

class MyInterfaceController: WKInterfaceController, WKCrownDelegate {
    var value = 1
    @IBOutlet var label: WKInterfaceLabel!

    override func awake(withContext context: Any?) {
        super.awake(withContext: context)
        crownSequencer.delegate = self
    }

    func crownDidRotate(_ crownSequencer: WKCrownSequencer?, rotationalDelta: Double) {
        let newValue = value + Int(rotationalDelta)
        if newValue < 1 {
            value = 1
        } else if newValue > 10 {
            value = 10
        } else {
            value = newValue
        }
        label.setText("Current value: \(value)")
    }
}

注意:请不要直接使用此代码,它只是一个示例。首先查看苹果网站上的文档。

您需要将
InterfaceController
子类与
WKCrownDelegate
相一致,并实施
crownDidRotate
方法

如果希望值介于1和10之间,只需实现一些简单的逻辑,以检查添加
rotationalDelta
时的值是多少,如果超出范围1-10,则根据新值将超出的方向,将值映射到1或10。我假设您希望
value
Int
,如果不希望,只需删除
rotationalDelta
Int
的转换,
value
将为
Double

请记住,1.0的
rotationalDelta
表示皇冠完全旋转,并且
rotationalDelta
根据旋转方向更改其符号

class MyInterfaceController: WKInterfaceController, WKCrownDelegate {
    var value = 1
    @IBOutlet var label: WKInterfaceLabel!

    override func awake(withContext context: Any?) {
        super.awake(withContext: context)
        crownSequencer.delegate = self
    }

    func crownDidRotate(_ crownSequencer: WKCrownSequencer?, rotationalDelta: Double) {
        let newValue = value + Int(rotationalDelta)
        if newValue < 1 {
            value = 1
        } else if newValue > 10 {
            value = 10
        } else {
            value = newValue
        }
        label.setText("Current value: \(value)")
    }
}
类MyInterfaceController:WKInterfaceController,wkDelegate{
var值=1
@IBOutlet var标签:WKInterfaceLabel!
覆盖函数唤醒(withContext:有吗?){
super.awake(withContext:context)
crownSequencer.delegate=self
}
func crownDidRotate(crownSequencer:WKCrownSequencer?,rotationalDelta:Double){
设newValue=value+Int(旋转增量)
如果newValue<1{
值=1
}否则,如果newValue>10{
值=10
}否则{
值=新值
}
label.setText(“当前值:\(值)”)
}
}

您好,谢谢您的回答!在实现这一点时,我需要一个新类,因为我试图将WKInterfaceController和WKCrownDelegate放入类游戏场景中,但它与已存在的SKScene存在问题。请在问题中包含您的类定义,以便我可以提供帮助,没有上下文,我无法确定此问题的原因。但您肯定需要使该
InterfaceController
类符合要使用crown控制的
WKCrownDelegate
协议。您应该添加crownSequencer.focus()以唤醒(使用上下文在SwiftUI中设置Delegates后,这变得更容易: