为什么我不能在Apple Watch的界面控制器之间发送数据?

时间:2017-04-15 23:44:46

标签: swift watchkit wkinterfacecontroller

基本上,我要做的是从一个接口控制器传递一个整数。控制器“SecondPage”中的滑块将从滑块获取一个整数值,并应将其发送到名为“ThirdPage”的接口控制器,并将该标签的标题设置为该值。我尝试了很多方法,但都无济于事。我只是试图从第二个接口控制器发送上下文,在第三个控制器的唤醒(withContext context:Any?)方法中接收它并将其保存为标题,直到再次更改滑块。

这是我在第二页控制器中首先尝试的内容,但它没有传递任何数据:

override func contextForSegueWithIdentifier(segueIdentifier: String) -> AnyObject? {
if segueIdentifier == "ThirdPage"{
    return sliderval
}
return nil
}

这是我之后尝试的,它传递了数据,但它并没有“保存”它。它会弹出带有更新标签的接口控制器到滑块值,但我不希望它弹出,我希望将该值保存到标签中。当我关闭弹出窗口并向右滑动到第三页时,标签仍称为“标签”

self.presentController(withName: "ThirdPage", context: sliderval)

以下是输出的一些图片以及我的一些代码。感谢任何帮助,谢谢。 PS:这一切都在Swift 3 enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

您的不良弹出问题正在发生,因为您在presentController()中呼叫sliderChanged()。每次滑块更改时,您都会告诉它弹出“ThirdPage”控制器。你可以删除它。

编辑:我的回答错误地认为提问者正在使用分层导航。对于基于页面的导航,显然没有办法将数据从一个页面传递到下一个页面,因此您仍然坚持使用全局,因为接受的答案表明。原始答案如下:

至于缺少传递上下文,我猜你可能没有在Interface Builder中设置segue标识符,或者它被设置为“ThirdPage”之外的其他东西。 segue与“ThirdPage”控制器分开,您必须单独设置其标识符。单击segue箭头中间的圆圈,然后在“属性”检查器中查看它。

假设我是对的,问题是contextForSegueWithIdentifier()正在使用您不期望的标识符进行调用。由于它不是“ThirdPage”,条件失败并返回nil。设置segue标识符应该修复它。

答案 1 :(得分:1)

您正在使用基于页面的导航,并且需要在页面之间传递数据。

我要做的是将滑块中的数据保存到第三页可以访问的某个位置,并填充willActivate上标签中的数据。当用户在页面之间滑动时,系统应调用willActivate方法。

在全局范围内,创建一个变量来保存滑块值。

var sliderValue: Float = 0

在第二个界面控制器中,滑块更改时设置此值。

@IBAction func sliderChanged(_ value: Float) {
    sliderValue = value
}

在第三个界面控制器中,当即将出现页面时,将标签设置为正确的值。

override func willActivate() {
    label.setText("\(sliderValue)")
}

如果您想避免使用全局变量,您可以从用户默认值中读取或写入,或使用其他策略,但这取决于您的应用程序的确切需求。