为collectionview重新加载数据
Posted
技术标签:
【中文标题】为collectionview重新加载数据【英文标题】:Reloading data for collectionview 【发布时间】:2014-02-06 16:54:58 【问题描述】:我有 2 个视图控制器
ViewControllerWithCollectionView (FIRST) 和 ModalViewControllerToEditCellContent (SECOND)
我以模态方式从 FIRST 转到 SECOND。编辑单元格。返回。
关闭 SECOND 控制器后,编辑的单元格在我调用之前不会更新 [收集重载数据];手动某处。
试图把它放在 viewWillAppear:animated: 中,当我检查日志时,它没有被调用(在关闭 SECOND 之后)
我尝试了各种解决方案,但我无法通过(也许我太累了)。我感觉我缺少一些基本的东西。
编辑关闭按钮
- (IBAction)modalViewControllerDismiss
self.sticker.text = self.text.text; //using textFields text
self.sticker.title = self.titleText.text;// title
//tried this also
CBSStickerViewController *pvc = (CBSStickerViewController *)self.stickerViewController;
//tried passing reference of **FIRST** controller
[pvc.cv reloadData];//called reloadData
//nothing
[self dismissViewControllerAnimated:YES completion:^];
【问题讨论】:
viewWillAppear 应在其呈现的 vc 被解除时在呈现的 vc 上触发。请发布关闭第二个视图控制器的代码并说明该代码所在的位置。- (IBAction)modalViewControllerDismiss self.sticker.text = self.text.text; //using textFields text self.sticker.title = self.titleText.text;// title //tried this also CBSStickerViewController *pvc = (CBSStickerViewController *)self.stickerViewController; //tried passing reference to **FIRST** controller [pvc.cv reloadData];//called reloadData [self dismissViewControllerAnimated:YES completion:^];
我之前的评论有误。 viewWillAppear 在呈现视图控制器被关闭时不会被调用。
【参考方案1】:
很难从发布的代码中看出您传递给第二个视图控制器的指向第一个视图控制器的指针有什么问题。您还应该能够在第二个视图控制器中引用self.presentingViewController
。无论哪种方式,更漂亮的设计是为第一个视图控制器找到一种方法来了解已进行更改并更新它自己的视图。
有几种方法,但我会在这里推荐委托模式。第二个视图控制器可以设置为让第一个视图控制器为其工作,即重新加载表视图。这是它在几乎代码中的样子:
// SecondVc.h
@protocol SecondVcDelegate;
@interface SecondVC : UIViewController
@property(weak, nonatomic) id<SecondVcDelegate>delegate; // this will be an instance of the first vc
// other properties
@end
@protocol SecondVcDelegate <NSObject>
- (void)secondVcDidChangeTheSticker:(SecondVc *)vc;
@end
现在第二个 vc 使用它来要求第一个 vc 为它工作,但是第二个 vc 对第一个 vc 的实现细节仍然很愚蠢。我们在这里没有引用第一个 vc 的 UITableView 或任何它的视图,也没有告诉任何表重新加载。
// SecondVc.m
- (IBAction)modalViewControllerDismiss
self.sticker.text = self.text.text; //using textFields text
self.sticker.title = self.titleText.text;// title
[self.delegate secondVcDidChangeTheSticker:self];
[self dismissViewControllerAnimated:YES completion:^];
现在必须做的就是让第一个 vc 做它必须成为代表的事情:
// FirstVc.h
#import "SecondVc.h"
@interface FirstVc :UIViewController <SecondVcDelegate> // declare itself a delegate
// etc.
// FirstVc.m
// wherever you decide to present the second vc
- (void)presentSecondVc
SecondVc *secondVc = // however you do this now, maybe get it from storyboard?
vc.delegate = self; // that's the back pointer you were trying to achieve
[self presentViewController:secondVc animated:YES completion:nil];
最后是妙语。实现委托方法。在这里,您通过重新加载表格视图来完成第二个 vc 想要的工作
- (void) secondVcDidChangeTheSticker:(SecondVc *)vc
[self.tableView reloadData]; // i think you might call this "cv", which isn't a terrific name if it's a table view
【讨论】:
就像一个魅力 :) 感谢您帮助我。 :) cv 是 UICollectionView 的实例。我应该叫它collectionView。以上是关于为collectionview重新加载数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在不重新加载 visibleCell 的情况下在 collectionView 上重新加载数据
重新加载集合视图数据时对成员 'collectionView(_:numberOfItemsInSection:)' 的模糊引用
UICollectionView 重新加载数据无法更新 CollectionView