我有一个带有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 )上并告诉我如何解决它?
这让我发疯了
答案 0 :(得分:0)
可能在Alamofire.request
之后调用viewDidAppear
的回调,这就解释了为什么你没有看到你在回调中设置的值。
您应该想要的是您的代码
if let a = userInfo.stringForKey("age") {
print("Age: \(a)")
} else {
print("nope")
}
。
你有几种方法:
resultsController
调用VC1
以更新其用户界面;
从回调中加载resultsController
(实际上,您确保在回调中第一次调用其view
方法,即将其作为子视图添加到父级时);
或者,您使用KVO
让VC1
观察对userInfo.age
的任何更改。这种方法需要通过从中派生新类来定制NSUserDefaults
。
答案 1 :(得分:0)
看起来vc1的加载速度比数据提取完成的速度快。
在加载新控制器之前等待加载数据,或者在数据完成时直接设置标签
答案 2 :(得分:0)
尝试以下一项。我认为它可能会对你有所帮助。
完成网络调用(在完成处理程序块中)时,使用outlet将值设置为标签等UI元素。并调用- (void)setNeedsLayout
方法。
此方法表示图层子图层的布局已更改且必须更新。当图层的边界发生变化时,系统通常会自动调用此方法。