【问题标题】:viewDidLoad vs viewWillAppear Where to setup tableview & its datasource?viewDidLoad vs viewWillAppear 在哪里设置 tableview 及其数据源?
【发布时间】:2016-09-07 13:08:40
【问题描述】:

我有一个UIViewController 子类,而我有一个UITableView。这是我目前使用viewDidLoad & viewWillAppear 的方式。

-(void)viewDidLoad
{
    //Setup my datasource
    //Setup my views, tableviews, constraints
}

-(void)viewWillAppear:(BOOL)animated
{
    //Setup my datasource
}

viewDidLoad 只会在构造视图时调用一次。每次访问视图控制器时都会调用viewWillAppear

在这里,我为什么在两个地方都设置我的数据源(NSArray)是,每当我进入视图控制器时,我只需要重建数据源数组。

我可以这样做。

-(void)viewDidLoad
{
    //Setup my views, tableviews, constraints
}

-(void)viewWillAppear:(BOOL)animated
{
    //Setup my datasource
    //Reload tableview
}

但是,当视图控制器出现时,显示数据感觉有点慢。

问题:

设置数据源数组的最佳做法是什么?我不希望仅在viewWillAppear 中设置延迟。还是应该像这样设置数据源?

-(void)viewDidLoad
    {
        //Setup my datasource
        //Setup my views, tableviews, constraints
    }

    -(void)viewWillAppear:(BOOL)animated
    {
        //Setup my datasource
        //Reload tableview
    }

如果是,第一次,我需要计算两次数据源数组。

为了克服这个问题,我需要通过在viewDidLoad 中设置它来保持BOOLisFirstTime 的值(存储在NSUserDefaults)并在viewWillAppear 方法中检查它,就像这个:

        -(void)viewDidLoad
        {
            //Set isFirstTime as YES
            //Setup my datasource
            //Setup my views, tableviews, constraints
        }

        -(void)viewWillAppear:(BOOL)animated
        {
            if(isFirstTime)
            {
               //Skip
               isFirstTime = NO;
            }

            else
            {
               //Setup my datasource
               //Reload tableview
            }
        }

我真的应该做这么复杂的事情来实现这一目标吗?需要建议!!

谢谢

【问题讨论】:

  • 除了viewDidLoad 之外,为什么你认为你需要设置这些?
  • 当我访问其他视图控制器时,我的数据源会定期更改。

标签: ios objective-c datasource viewdidload viewwillappear


【解决方案1】:

只需在 viewdidload 中设置视图和数据源。您不需要在 viewwillappear 中设置数据源增益,甚至不需要在 view 中显示重新加载数据,因为再次呈现视图时表格会自动重新加载

【讨论】:

  • 不,表格视图不会自动重新加载。
  • @rmaddy 为了清楚起见,当 ios 初始化视图控制器时,假设这个控制器有 tableview,然后你推送另一个控制器并返回到前一个控制器,然后 ios 将再次自动调用 tableview 委托并渲染tableview 不需要调用 tableview reload
  • 您最后的陈述不正确。 UITableViewController 可能会这样做,但普通的 UIViewController 肯定不会。
  • @Avi 尝试在 cellforrow 中放置断点并创建我向 maddy 解释过的上述场景,您就会明白
猜你喜欢
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 2010-12-07
相关资源
最近更新 更多