4

基本上,我想做的是从一个接口控制器传递一个整数。控制器“SecondPage”中的滑块将从滑块中获取一个整数值,并将其发送到名为“ThirdPage”的界面控制器,并将该标签的标题设置为该值。我尝试了很多方法,但都无济于事。我只是想从第二个接口控制器发送上下文,在第三个控制器的 awake(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 中在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

4

2 回答 2

1

您不希望出现的弹出问题正在发生,因为您正在调用presentController(). sliderChanged()每次滑块更改时,您都在告诉它弹出“第三页”控制器。你可以删除它。

编辑:我的回答错误地假设提问者正在使用分层导航。对于基于页面的导航,显然没有办法将数据从一页传递到下一页,因此您只能按照公认的答案建议使用全局。原答案如下:

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

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

于 2017-04-16T00:13:06.883 回答
1

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

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

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

var sliderValue: Float = 0

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

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

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

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

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

于 2017-04-16T00:14:23.140 回答