【问题标题】:does this code really need a "[self.tableView reloadData]" at the end of viewDidLoad (in a UITableViewController)这段代码是否真的需要在 viewDidLoad 末尾添加一个“[self.tableView reloadData]”(在 UITableViewController 中)
【发布时间】:2011-07-05 12:40:21
【问题描述】:

SimpleEKDemo 示例在 RootViewController.m 文件的 viewDidLoad 末尾有一个“[self.tableView reloadData]”。

这有必要吗?任何想法为什么要放入这条线?视图不会在 viewDidLoad 之后通过它调用委托到“cellForRowAtIndexPath”之类的方法来绘制吗?

- (void)viewDidLoad {
    self.title = @"Events List";

    // Initialize an event store object with the init method. Initilize the array for events.
    self.eventStore = [[EKEventStore alloc] init];

    self.eventsList = [[NSMutableArray alloc] initWithArray:0];

    // Get the default calendar from store.
    self.defaultCalendar = [self.eventStore defaultCalendarForNewEvents];

    //  Create an Add button 
    UIBarButtonItem *addButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:
                                UIBarButtonSystemItemAdd target:self action:@selector(addEvent:)];
    self.navigationItem.rightBarButtonItem = addButtonItem;
    [addButtonItem release];


    self.navigationController.delegate = self;

    // Fetch today's event on selected calendar and put them into the eventsList array
    [self.eventsList addObjectsFromArray:[self fetchEventsForToday]];

    [self.tableView reloadData];   // ** REALLY NEEDED ** 

}

编辑-我确实在文档中注意到了这一点(见下文)-我仍然不清楚上面的代码行是如何需要的-如果您转到另一个视图,然后返回这个视图,那么如果(a)视图被重新初始化而不是它必须再次填充自己,或者(b)如果视图不想重新初始化,则不会调用“viewDidLoad”方法,因此你会在这两种情况下都不会将“reloadData”行代码放在 viewDidLoad 方法的末尾吗?

UITableView 覆盖 UIView 的 layoutSubviews 方法所以 仅当您调用 reloadData 创建一个新的 UITableView 实例 或者当您分配新的数据源时。 重新加载表格视图清除 当前状态,包括当前 选择。但是,如果您明确 调用 reloadData,它会清除此状态 以及任何随后的直接或间接 调用 layoutSubviews 不会 触发重新加载。

【问题讨论】:

    标签: iphone ios uitableview viewdidload


    【解决方案1】:

    如果你有静态数据,这并不是真正需要的,但是当你想从数据源更新表格内容时,你就需要了。

    例如

    假设您要添加一条您在表格中输入的记录,并且您希望在添加时在表格中显示该数据。您在第一页上有一个表格,然后在第二个视图中添加一条记录并返回到第一个视图。那么你需要显示新数据,但这次你的表的 deta 源方法没有被调用,这就是你需要重新加载数据的原因,所以这一行调用表的数据源方法。

    我想你能理解这种情况。

    编辑:

    当我们删除一行时,该数据会从数据库中删除,但如果您不使用表调用 delete,则该数据仍保留在表中。 现在您正在调用数据库函数并在 viewWillAppear 函数的数组中获取记录现在您可以做什么 只需从 commitEditingStyle 函数中调用 viewWillappear 并在 viewWillappear 中重新加载表格。在这种情况下,您需要重新加载表格

    【讨论】:

    • 嗯,这让我意识到我不确定实际调用“viewDidLoad”的频率 - 例如,每次您从编辑视图返回到自身时都会调用它吗?如果不是这样,这不会突出一个问题,因为代码会经常分配变量,例如 EKEventStore,苹果说你应该避免过于频繁地重新创建它,因为它是资源密集型的
    • @Ishu - 但我不是 100% 相信它是正确的,而且还没有其他人支持?我只是注释掉了SimpleEKDemo中的那一行,然后动态添加了一些数据(点击demo中的ADD按钮),然后当它返回到table view时它是最新的(即没有[self.tableView reloadData ] 到位)
    • @Greg,请告诉我您的 sdk。我认为在更高版本中 viewDidLoad 不会在您返回时再次调用。所以当时我们在 viewWillappear 中编写此代码。 Apple 从不加载多个页面。如果 viewDidLoad 调用,那么这也是正确的,不需要重新加载数据。但是当我将它与 3.1.3 和 4.2 一起使用时,应用程序需要在 viewWillappear 中重新加载自身并且未调用 viewDidLoad
    • 我运行的是最新的 4.2 版本的 Ishu
    • 好吧,我认为如果 viewDidLoad 调用你不需要表重新加载功能。如果 viewDidLoad 没有调用,那么你需要重新加载数据。
    猜你喜欢
    • 2021-02-18
    • 2021-03-21
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 2013-02-15
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多