显示滚动视图中的视图时如何更新? Viewdidload 不工作?

How to update when view within scrollview is displayed? Viewdidload not working?

我的情况有点棘手,因为我的应用程序设计得像 Snapchat,因为我有 3 个视图(3 个不同的 xibs 和 类),它们都包含在一个滚动视图中。这是我在 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 仅在应用程序首次打开时被我的视图控制器和这些子视图调用一次,这意味着当我滚动浏览时它不会被我的子视图一次又一次地调用。我的问题是我没有办法在我的子视图中更新标签,因为我没有 "update" 函数-

我在 NSUserdefaults 中存储了几个 ints/values,这些随着应用程序的变化而变化 运行。在 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() 希望这可能会有所影响,但没有成功。这是一个大问题。

我是否应该尝试制作标签 public 并直接从另一个视图更改它们?有没有类似sprite kit里的update函数可以在每一帧前调用?

我该如何解决这个问题?

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 在您想要存储某些值时使用,即使在应用程序终止时也是如此。除非您想保留这些值,否则请改用属性、变量。

此外,您似乎没有很好地描述您的 variables/properties。使用名称 photos 作为标签是个坏主意。应该类似于 photoLabel.