我处于一种棘手的情况,因为我的应用程序设计为Snapchat,因为我有3个视图(3个不同的xib和类),它们都包含在scrollview中。这是我在ViewController中的设置:
@IBOutlet var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let v1 : View1 = View1(nibName: "View1", bundle: nil)
let v2 : View2 = View2(nibName: "View2", bundle: nil)
let v3 : View3 = View3(nibName: "View3", bundle: nil)
self.addChildViewController(v1)
self.scrollView.addSubview(v1.view)
v1.didMoveToParentViewController(self)
self.addChildViewController(v2)
self.scrollView.addSubview(v2.view)
v2.didMoveToParentViewController(self)
self.addChildViewController(v3)
self.scrollView.addSubview(v3.view)
v3.didMoveToParentViewController(self)
var v2Frame : CGRect = v2.view.frame
v2Frame.origin.x = self.view.frame.width
v2.view.frame = v2Frame
var v3Frame : CGRect = v3.view.frame
v3Frame.origin.x = self.view.frame.width * 2
v3.view.frame = v3Frame
self.scrollView.contentSize = CGSizeMake(self.view.frame.width * 3, self.view.frame.height)
}
ViewdidLoad只有我的视图控制器和这些子视图在应用程序首次打开时调用一次,这意味着当我滚动浏览时,我的子视图不会再次调用它。我的问题是我没有办法在我的子视图中更新标签,因为我没有"更新"功能 -
我在NSUserdefaults中存储了几个整数/值,这些在应用运行时会发生变化。在View1
中,我有3个标签显示与某些键有关的int值:
if prefs.objectForKey("photos") != nil //fix for cross updating
{
photos.text = String(self.prefs.integerForKey("photos"))
}
else {
photos.text = "0"
}
这非常有用,但仅限于首次打开应用时。如果prefs.integerForKey("photos")
在应用运行时发生变化,当我回到View1
时,标签仍会显示相同的旧值。我无法再次调用上面的代码块来更新标签。
我试过prefs.synchronize()
希望这会影响某些事情,但没有成功。这是一个大问题。
我应该尝试公开标签并直接从其他视图更改标签吗?是否有类似于sprite工具包中的更新功能,我可以在每帧之前调用它?
我该如何解决这个问题?
答案 0 :(得分:1)
1:您的子视图控制器中应该有更新标签文本的功能。像updatePhotoLabelWithInt(int: Int)
这样的东西。
2:另一个选项是为您的子视图控制器或存储属性设置计算属性,并观察这些属性,如下所示:
// Option 1
var numberOfPhotos: Int {
get { Int(label.text)! }
set { label.text = String(newValue) }
}
// Option 2
var numberOfPhotos: Int {
didSet { label.text = String(numberOfPhotos) }
}
当您想要存储某些值时,即使应用程序被终止,也会使用 NSUserDefaults
。除非您想保留这些值,否则请使用属性和变量。
此外,您似乎没有非常具有描述性地命名您的变量/属性。使用名称photos
作为标签是一个坏主意。应该是photoLabel
。