【问题标题】:Is there a way to avoid viewDidLoad beeing called after every segue?有没有办法避免在每次转场后调用 viewDidLoad ?
【发布时间】:2013-04-17 00:21:00
【问题描述】:

我在我的主 ViewController 中初始化表、数据等。如需更多设置,我想调用另一个 Viewcontroller:

 DateChangeController *theController = [self.storyboard instantiateViewControllerWithIdentifier:@"dateChangeController"];
[self presentViewController:theController animated:YES completion:^{NSLog(@"View controller presented.");}];

稍后我会返回一个segue(自定义:)

NSLog(@"Scroll to Ticket");
[self.sourceViewController presentModalViewController:self.destinationViewController animated:YES];

我的问题:

返回到我的主 ViewController 后,(每次)都会调用 viewDidLoad。我读到,ARC 在“转到”另一个 ViewController 并调用 viewDidUnload 方法后释放了我的 mainView,但我想保留我的所有数据和表格我在开始时初始化..

有什么解决办法吗?非常感谢!

【问题讨论】:

    标签: iphone storyboard segue viewdidload


    【解决方案1】:

    问题是你正在这样做:

    main view controller ->
        date change controller ->
            a *different* main view controller
    

    换句话说,虽然在您的口头描述中您使用了“返回到我的主 ViewController”,但您实际上并没有返回;您每次都在前进到此主视图控制器的另一个实例,将所有这些视图控制器堆叠在一起。

    返回现有视图控制器的方法不是进行segue,而是返回!来自presentViewController 的返回是dismissViewController。您不为此使用segue;您只需致电dismissViewController。 (好吧,在 iOS 6 中你可以实际上使用 segue,但它是一种非常特殊且相当复杂的 segue,称为 Unwind 或 Exit segue。)

    如果你这样做,你会回到原来的视图控制器,它一直坐在那里等你回来,viewDidLoad 不会被调用。

    所以,你问这个问题很好,因为viewDidLoad 的双重调用向你表明你的架构全错了。

    【讨论】:

    【解决方案2】:

    我认为您采取了错误的方法 - viewDidLoad 应该在被调用时被调用 - 这是一个通知您视图正在刷新或初始加载。您要做的是将该表初始化代码移到其他地方,或者至少设置一个布尔变量,以便它只被调用一次。在第一次调用 viewDidLoad 时创建一个包含您的表数据的对象,然后检查它是否已被调用?

    【讨论】:

    • 是的,这也是我的解决方案,但我认为那将是“糟糕的编程”
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 2018-07-11
    • 2019-09-07
    • 1970-01-01
    • 2019-05-29
    • 2021-10-10
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多