导航回来时重新加载UITableView?

问题描述:

我有顶级UIViewController,其中包含UITableView。顶级UIViewController实例化NavigationController,并将另一个UIViewController推到NavigationController上。 I.E.我们推入了新的第二种观点。第二个视图在左上角具有通常的“返回”按钮,以允许您导航回顶层视图。导航回来时重新加载UITableView?

从第二个视图导航回顶层视图时,是否可以使用第二个视图中生成的数据在顶层视图中重绘UITableView,在顶层调用cellForRowAtIndexPath,如果是这样,如何做到这一点?

所有你需要做的就是这个(在你的UIViewController中有一个UITableView)。您现在不必担心单元级的情况。

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self.tableView reloadData]; // to reload selected cell 
} 

只需添加上面的代码到你的控制器,你会看到,当你从你的第二个观点回到正确的事情发生了。对reloadData的调用告诉表视图,它需要从模型中刷新它的单元格,其他所有内容都很好地遵循。

+1

我用这个方法,却不得不因为他们在那里初始加载两个发射的代码从我didViewLoad移动到viewWillAppear中。对我而言,这是一个更大的问题,因为我需要从Web服务下载新的项目详细信息 – PowerMan2015 2015-11-28 16:46:46

您可以实现UINavigationControllerDelegate的方法,并在弹出视图控制器时创建刷新逻辑。

另一种方法可以在你的表视图控制器上实现一些viewWillAppear上的逻辑,根据弹出视图控制器的数据进行刷新。

如果您需要将数据从第二个视图控制器发送到第一个视图控制器,请记住您的第二个视图控制器“不”知道前一个视图控制器的存在。它应该是透明的。您应该实现一些协议以使第二个视图控制器将数据发送到第一个视图控制器。这将是这个问题的第三个选择,因为你的第一个视图控制器将是委托,第二个视图控制器将发送信息给委托,你可以准备你的表视图(第一个视图控制器)重新加载,基于收到数据。

如果你只是想重装选择该小区,覆盖viewWillAppear:UITableViewController定制子类,像这样:

- (void)viewWillAppear:(BOOL)animated 
{ 
    NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow]; 
    [super viewWillAppear:animated]; // clears selection 
    if (selectedRowIndexPath) { 
     [self.tableView reloadRowsAtIndexPaths:@[selectedRowIndexPath] withRowAnimation:UITableViewRowAnimationNone]; 
    } 
} 

注意:假设你已经离开clearsSelectionOnViewWillAppear设置为YES(默认值),在调用super之前,您必须获得所选行的索引路径,这将清除选择。

此外,只需拨打[self.tablView reloadData]solution of @ZoranSimic是可以接受的,因为它代码少,效率高。最后,也许让表格视图的单元格与它们所代表的模型对象保持同步的最佳方法是使用NSFetchedResultsController并使用键值观察(KVO)和/或NSNotification通知您的表格视图控制器何时建模对象已更改,以便它可以重新加载相应的单元格。表格视图控制器可以开始观察对viewDidLoad中模型对象的更改,并在dealloc(以及您的manually unload self.view任意位置)结束观察。

在这里除了斯威夫特代码answer of Zoran Simic

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    tableView.reloadData() 
} 
+0

当您想从'viewWillAppear()'重新加载数据时,请小心不要从viewDidLoad()中获取数据。 – 2017-03-07 06:36:04

也许现在可以提供帮助。

对于斯威夫特2+

在您的viewDidAppear方法:

如果你想重新加载所有表:

tableView.reloadData() 

如果你只想要细胞选择重新加载。

let index = tableView.indexPathForSelectedRow 
if (index != nil){ 
    self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Automatic) 
} 

viewWillAppear每当视图出现时都会被调用,包括第一次。 这里是我重新加载,只有当你导航回到

我创造我的ViewController.h file一个变量来检查,这是我第一次去这个ViewController或当我向后导航

@property (nonatomic) BOOL isViewExist; 
视图解决方案

后,在viewWillAppear

-(void)viewWillAppear:(BOOL)animated{ 
    if(!self.isViewExist){ 
     self.isViewExist = YES; // check it is the first time you go to this ViewController -> don't reload anything 
    }else{ 
     [self.tableView reloadData]; // to reload the tableview data 
     // or your can refresh anything in your ViewController as you want 
    } 
} 

希望这有助于

更新了斯威夫特3

let index = tableView.indexPathForSelectedRow 
    if (index != nil){ 
     self.tableView.reloadRows(at: [index!], with: UITableViewRowAnimation.automatic) 
    } 
+0

_in - 覆盖func viewDidLoad()或??? _ - 代表无法评论的用户发表评论 – Tushar 2016-12-01 03:21:03