Swift:NSUserDefaults没有立即设置

时间:2016-02-29 14:55:35

标签: ios swift uipageviewcontroller alamofire

我拥有什么

我有一个带有UITableView的视图控制器( SelectNameViewController ),并带有一个名称列表。当用户单击一个名称时,它会转到一个ViewController( ResultController ),它有一个容器视图,可以加载3个ViewControllers( vc1 vc2 vc3 )允许用户滚动浏览。

ResultController 上,我有一个连接到JSON文件的alamofire请求,并根据所选名称下载信息:

Alamofire.request(.GET, sendyURLSet, parameters: ["name": passedName, "api_key": api_key])
.responseJSON { response in
    switch response.result {
       case .Success:

       if let value = response.result.value {
          let json = JSON(value)

          self.age = json["age"].stringValue
          self.userInfo.setValue(self.age, forKey: "age")

        }
       case .Failure(let error):
           print(error)
   }
}

VC1 上,我的 viewDidAppear

if let a = userInfo.stringForKey("age") {
        print("Age:  \(a)")
    } else {
        print("nope")
}

问题

在从Alamofire请求加载内容后,我无法在PageViewController子视图上加载数据。

当用户点击名称并进入 ResultController 时,3个视图会加载到容器视图中。出现的第一个屏幕是 vc1

然而,在控制台中我得到:

  

都能跟得上

如果我刷到 vc2 然后再回到 vc1 ,我会得到:

  

32岁

在控制台中。

问题

有人可以告诉我为什么价值没有出现在ViewController的第一个演示文稿( vc1 )上并告诉我如何解决它?

这让我发疯了

3 个答案:

答案 0 :(得分:0)

可能在Alamofire.request之后调用viewDidAppear的回调,这就解释了为什么你没有看到你在回调中设置的值。

您应该想要的是您的代码

if let a = userInfo.stringForKey("age") { print("Age: \(a)") } else { print("nope") }

执行回调后调用

你有几种方法:

  • resultsController调用VC1以更新其用户界面;

  • 从回调中加载resultsController(实际上,您确保在回调中第一次调用其view方法,即将其作为子视图添加到父级时);

  • 或者,您使用KVOVC1观察对userInfo.age的任何更改。这种方法需要通过从中派生新类来定制NSUserDefaults

答案 1 :(得分:0)

看起来vc1的加载速度比数据提取完成的速度快。

在加载新控制器之前等待加载数据,或者在数据完成时直接设置标签

答案 2 :(得分:0)

尝试以下一项。我认为它可能会对你有所帮助。

完成网络调用(在完成处理程序块中)时,使用outlet将值设置为标签等UI元素。并调用- (void)setNeedsLayout方法。

此方法表示图层子图层的布局已更改且必须更新。当图层的边界发生变化时,系统通常会自动调用此方法。