为什么我不能在 Apple Watch 的接口控制器之间发送数据?
Why can't I send data between interface controllers for Apple Watch?
基本上,我要做的是从一个接口控制器传递一个整数。控制器 "SecondPage" 中的滑块将从滑块获取一个整数值,并将其发送到名为 "ThirdPage" 的界面控制器并将该标签的标题设置为该值。我尝试了很多方法,但都无济于事。我只是想从第二个界面控制器发送上下文,在第三个控制器的 awake(withContext context: Any?) 方法中接收它,并将它保存为标题,直到再次更改滑块。
这是我在第二个页面控制器中首先尝试的,但它没有传递任何数据:
override func contextForSegueWithIdentifier(segueIdentifier: String) -> AnyObject? {
if segueIdentifier == "ThirdPage"{
return sliderval
}
return nil
}
这是我之后尝试的方法,它传递了数据,但没有 "save"。它弹出带有更新标签的界面控制器到滑块值,但我不希望它弹出,我希望将该值保存到标签中。当我关闭弹出窗口并向右滑动到第三页时,标签仍称为 "Label"
self.presentController(withName: "ThirdPage", context: sliderval)
这是一些输出图片以及我的一些代码。感谢您的帮助,谢谢。 PS:这都在Swift3
出现意外的弹出窗口问题是因为您在 sliderChanged()
中调用 presentController()
。每次滑块变化时,您都在告诉它弹出 "ThirdPage" 控制器。你可以删除它。
编辑: 我的回答错误地假设提问者正在使用分层导航。对于基于页面的导航,显然没有办法将数据从一个页面传递到下一个页面,因此您只能按照接受的答案建议使用全局。原答案如下:
至于缺少传递上下文,我猜您可能没有在 Interface Builder 中设置 segue 标识符,或者它设置为 "ThirdPage" 以外的其他内容。 segue 与 "ThirdPage" 控制器是分开的,您必须单独设置它的标识符。单击 segue 箭头中间的圆圈,然后在属性检查器中查看它。
假设我是对的,问题是 contextForSegueWithIdentifier()
被调用时使用了您不希望的标识符。由于它不是 "ThirdPage",条件失败并且 returns 为零。设置 segue 标识符应该可以解决它。
您正在使用基于页面的导航,需要在页面之间传递数据。
我要做的是将滑块中的数据保存到第三页可以访问的某个位置,然后将数据填充到 willActivate
上的标签中。 willActivate
方法应在用户在页面之间滑动时由系统调用。
在全局范围内,创建一个变量来保存滑块值。
var sliderValue: Float = 0
在你的第二个界面控制器中,当滑块改变时设置这个值。
@IBAction func sliderChanged(_ value: Float) {
sliderValue = value
}
在您的第三个界面控制器中,当页面即将出现时,将标签设置为正确的值。
override func willActivate() {
label.setText("\(sliderValue)")
}
如果您想避免使用全局变量,您可以从用户默认值读取和写入,或使用其他策略,但这将取决于您的应用程序的具体需求。
基本上,我要做的是从一个接口控制器传递一个整数。控制器 "SecondPage" 中的滑块将从滑块获取一个整数值,并将其发送到名为 "ThirdPage" 的界面控制器并将该标签的标题设置为该值。我尝试了很多方法,但都无济于事。我只是想从第二个界面控制器发送上下文,在第三个控制器的 awake(withContext context: Any?) 方法中接收它,并将它保存为标题,直到再次更改滑块。
这是我在第二个页面控制器中首先尝试的,但它没有传递任何数据:
override func contextForSegueWithIdentifier(segueIdentifier: String) -> AnyObject? {
if segueIdentifier == "ThirdPage"{
return sliderval
}
return nil
}
这是我之后尝试的方法,它传递了数据,但没有 "save"。它弹出带有更新标签的界面控制器到滑块值,但我不希望它弹出,我希望将该值保存到标签中。当我关闭弹出窗口并向右滑动到第三页时,标签仍称为 "Label"
self.presentController(withName: "ThirdPage", context: sliderval)
这是一些输出图片以及我的一些代码。感谢您的帮助,谢谢。 PS:这都在Swift3
出现意外的弹出窗口问题是因为您在 sliderChanged()
中调用 presentController()
。每次滑块变化时,您都在告诉它弹出 "ThirdPage" 控制器。你可以删除它。
编辑: 我的回答错误地假设提问者正在使用分层导航。对于基于页面的导航,显然没有办法将数据从一个页面传递到下一个页面,因此您只能按照接受的答案建议使用全局。原答案如下:
至于缺少传递上下文,我猜您可能没有在 Interface Builder 中设置 segue 标识符,或者它设置为 "ThirdPage" 以外的其他内容。 segue 与 "ThirdPage" 控制器是分开的,您必须单独设置它的标识符。单击 segue 箭头中间的圆圈,然后在属性检查器中查看它。
假设我是对的,问题是 contextForSegueWithIdentifier()
被调用时使用了您不希望的标识符。由于它不是 "ThirdPage",条件失败并且 returns 为零。设置 segue 标识符应该可以解决它。
您正在使用基于页面的导航,需要在页面之间传递数据。
我要做的是将滑块中的数据保存到第三页可以访问的某个位置,然后将数据填充到 willActivate
上的标签中。 willActivate
方法应在用户在页面之间滑动时由系统调用。
在全局范围内,创建一个变量来保存滑块值。
var sliderValue: Float = 0
在你的第二个界面控制器中,当滑块改变时设置这个值。
@IBAction func sliderChanged(_ value: Float) {
sliderValue = value
}
在您的第三个界面控制器中,当页面即将出现时,将标签设置为正确的值。
override func willActivate() {
label.setText("\(sliderValue)")
}
如果您想避免使用全局变量,您可以从用户默认值读取和写入,或使用其他策略,但这将取决于您的应用程序的具体需求。