使用委托将数据从 Collection View Controller 传递到 View Controller

Posted

技术标签:

【中文标题】使用委托将数据从 Collection View Controller 传递到 View Controller【英文标题】:Pass data from Collection View Controller to View Controller using delegates 【发布时间】:2017-12-17 21:40:56 【问题描述】:

按下按钮时,我试图将数据从集合视图控制器发送到我的视图控制器。这是我目前所拥有的:

CollectionViewController.h

#import <UIKit/UIKit.h>

@class CollectionViewController;

@protocol CollectionViewDelegate <NSObject>

-(void) sendTest;

@end
@interface CollectionViewController : UICollectionViewController

@property (nonatomic, weak) id<CollectionViewDelegate> deligate;

@end

CollectionViewController.m

-(void) viewDidLoad 
  [super viewDidLoad];


...

NSLog(@"check");
[self.deligate sendTest];
NSLog(@"called");

FooViewController.m

#import "CollectionViewController.h"

@interface FooViewController () <CollectionViewDelegate> 
@end

@implementation FooViewController

- (void)viewDidLoad 
    [super viewDidLoad];

    CollectionViewController *controler = [[CollectionViewController alloc] init];
    controler.deligate = self;


- (void) sendTest 
    NSLog(@"Delegates are great!");

不幸的是,当我打电话给[self.deligate sendTest]; 时,什么也没发生。我知道它被调用了,因为我得到了checkcalled 日志。

【问题讨论】:

self.deligate 在您调用sendTest 时可能为零,因为 FooViewController 已被释放。拥有那些 NSLogs 并不会告诉你什么。使用一些断点。 好的,感谢有关日志的建议。你能解释一下self.deligate吗?也许如何不让FooViewController 被释放?谢谢! 委托属性“deligate”有一个弱引用,这很好,但这意味着委托需要被其他对象保留。我可以认为也许你在某个时候解雇了 FooViewController,然后它就永远消失了。您可以发布更多代码吗?你什么时候展示 CollectionViewController? 项目的其余部分包含许多其他代码,可能会使其更复杂。集合视图控制器位于容器视图中。项目链接:github.com/pudility/quick-things/tree/master/quickthings/src/… 再次感谢您的帮助。 【参考方案1】:

主要错误是您自己创建了CollectionViewController,但您不应该这样做。您想要的 CollectionViewController 由 Storyboard 自动实例化。如何找到这个视图控制器?

1 - 在 FooViewController 中的 segue 期间捕获它:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 

    CollectionViewController *collectionViewController =(CollectionViewController *) segue.destinationViewController;
    collectionViewController.deligate = self;

2 - 在 FooViewController 的子视图控制器中找到它

self.childViewControllers

对你有帮助吗?

【讨论】:

以上是关于使用委托将数据从 Collection View Controller 传递到 View Controller的主要内容,如果未能解决你的问题,请参考以下文章

将 UIImage 分配给 Collection View Cell

C#委托(Delegate)简介

从 Collection View Xcode 中删除 Collection View Cell

实现从 viewController 到 DataManager 类的委托

iOS Modern Collection View

VIPER中UITableView委托和数据源的实现