导航回来时重新加载UITableView?
我有一个包含UITableView
的顶级UIViewController
。 顶层的UIViewController
实例化一个NavigationController
,并将另一个UIViewController
放到NavigationController
。 IE浏览器推入新的第二种观点。 第二个视图在左上angular具有通常的“后退”button,可以导航回顶层视图。
当从第二个视图导航回顶层视图时,是否有可能使用第二个视图中生成的数据通过调用顶层的cellForRowAtIndexPath
重绘顶层视图中的UITableView
,如果是这样,这个?
所有你需要做的是(在你的UIViewController有一个UITableView)。 在这一点上,你不必担心单元级的情况。
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.tableView reloadData]; // to reload selected cell }
只要将上面的代码添加到你的控制器中,当你从第二个视图返回时,就会看到正确的事情发生。 对reloadData
的调用告诉表视图,它需要从你的模型中刷新它的单元格,其他所有内容都很好地遵循。
如果你只想重新加载被选中的单元格,可以在你的UITableViewController
的自定义子类中重写viewWillAppear:
:
- (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
之前获取所选行的索引path,这会清除select内容。
此外, @ZoranSimic只是调用[self.tablView reloadData]
的解决scheme是可以接受的,因为它代码less,效率高。
最后,或许让表格视图的单元格与它们所代表的模型对象保持同步的最好方法就是像NSFetchedResultsController
一样做,并使用键值观察(KVO)和/或NSNotification
通知您的表格视图控制器何时模型对象已经更改它可以重新加载相应的单元格。 表视图控制器可以开始观察在viewDidLoad
对其模型对象viewDidLoad
更改,并在dealloc
(以及手动卸载self.view
任何位置)结束观察。
除了Zoran Simic在这里的Swift代码的答案 :
override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) tableView.reloadData() }
你可以实现UINavigationControllerDelegate
的方法,并在popup视图控制器时创build刷新的逻辑。
另一种方法是在你的表视图控制器上实现viewWillAppear
一些逻辑,根据popup视图控制器的数据进行刷新。
如果您需要将数据从第二个视图控制器发送到第一个视图控制器,请记住您的第二个视图控制器“不”知道以前的视图控制器的存在。 它应该是透明的。 你应该实现一些协议,使第二个视图控制器发送数据到第一个视图控制器。 这将是这个问题的第三个选项,因为你的第一个视图控制器将是委托,第二个视图控制器将发送信息给委托,你可以准备你的表视图(第一个视图控制器)重新加载,基于收到数据。
viewWillAppear
每当包含第一次出现的视图时都会被调用。 这里是我的解决scheme,重新加载视图只有当你回去
我在我的ViewController
.h file
中创build了一个variables,用于检查这是我第一次访问这个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 } }
希望这个帮助
也许现在可以帮助。
对于Swift 2+
在你的viewDidAppear方法中:
如果你想重新载入所有的表格:
tableView.reloadData()
如果只想重新加载选中的单元格。
let index = tableView.indexPathForSelectedRow if (index != nil){ self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Automatic) }
更新了Swift 3
let index = tableView.indexPathForSelectedRow if (index != nil){ self.tableView.reloadRows(at: [index!], with: UITableViewRowAnimation.automatic) }