如何在滚动视图中显示视图时更新? Viewdidload无法正常工作?

时间:2016-06-10 15:50:51

标签: ios swift uiscrollview nsuserdefaults

我处于一种棘手的情况,因为我的应用程序设计为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工具包中的更新功能,我可以在每帧之前调用它?

我该如何解决这个问题?

1 个答案:

答案 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