如何从自定义 UICollectionViewCell 启动 View Controller

Posted

技术标签:

【中文标题】如何从自定义 UICollectionViewCell 启动 View Controller【英文标题】:How to launch View Controller from a custom UICollectionViewCell 【发布时间】:2014-07-22 08:25:22 【问题描述】:

我需要从我的自定义UICollectionViewCell 启动ViewController,但我无法在那里访问我的navigationController,所以我不知道如何启动它,因为我只知道一种方法。

只有这样的例子

LoginViewController *loginView = [[LoginViewController alloc]init];
[self.navigationController pushViewController:loginView animated:YES];

知道我该怎么做吗?

这就是我通常所说的cellclick

- (void)collectionView:(PSCollectionView *)collectionView didSelectCell:(PSCollectionViewCell *)cell atIndex:(NSInteger)index

[NjoftimeManager setSelectedListing:[[NjoftimeManager getMainListings] objectAtIndex:index]];
ListingViewController *listingView = [[ListingViewController alloc]init];
[self.navigationController pushViewController:listingView animated:YES];

但我想要做的是与这里不同的称呼

- (void) profileTapped:(UIGestureRecognizer *)gesture
//some code

NSLog(@"PROFILI %li",(long)gesture.view.tag);

我已经给cell 的页脚视图添加了一个标签,并且想要在点击它时做一些不同的事情,我只能在Cell 类中获得点击事件。

【问题讨论】:

您需要将您的 UINavigationController 作为主窗口中的 rootViewController。然后你就可以启动它了。 如果您使用故事板,您可以绑定集合视图单元格和新控制器(并选择推送)。这样在点击集合视图单元格时,它将推送新的视图控制器。或者明确地调用“performSegueWithIdentifier”。它能解决你的问题吗? 我不使用故事板也不使用xib,只有代码 因此,如果您只使用代码,请在单元格上定义块。将它们分配给单元格并根据所需的操作调用它们。或者您可以编写 ViewController 的自定义扩展添加导航控制器。 @Elgert 我编辑了代码请检查 【参考方案1】:

如果我完全理解你的问题,你想从集合视图单元中启动一个视图控制器,作为一个根视图控制器,你可以推送和弹出其他视图控制器

你可以这样做,

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath: (NSIndexPath *)indexPath

   LoginViewController *loginView = [[LoginViewController alloc]init];
   UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:loginController]; //add this as a root view controller
   [self presentViewController:navController animated:YES completion:nil]; 
 

编辑 在您的自定义单元格中定义一个自定义委托,例如我举了一个例子 CustomCollectionVIewCell 作为我在CustomCollectionVIewCell.h 中的自定义单元格,我定义了一个自定义委托,如下所示

 CustomCollectionVIewCell.h

 #import <UIKit/UIKit.h>
 @protocol CellFooterDelegate <NSObject>
  - (void)cellFooterViewTapped; //this this is the custom delegate method
 @end

 @interface CustomCollectionVIewCell : UICollectionViewCell
 @property (weak, nonatomic) IBOutlet UIView *footerCellView;
 @property (nonatomic, assign) id<CellFooterDelegate> myCustomdelegate;//define a delegate
 @end

CustomCollectionVIewCell.m

在这个方法中你正在调用这个方法

 - (void)profileTapped:(UITapGestureRecognizer *)gesture
  
    //some code
    if([_myCustomdelegate respondsToSelector:@selector(cellFooterViewTapped)])
    
       [_myCustomdelegate cellFooterViewTapped]; //call the delegate method 
    

    NSLog(@"PROFILI %li",(long)gesture.view.tag);
  

在你使用集合视图的视图控制器中你做这样的事情 像其他代表一样确认自定义代表 ViewController.h

#import "CustomCollectionVIewCell.h" //import the file
@interface ViewController :  UIViewController<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout,CellFooterDelegate>//hear i am confirming to custom delegate 
//.... other code

ViewController.m 文件中

 -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    
     CustomCollectionVIewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
     cell.myCustomdelegate = self; //important as u set self call back to this as u tap the cells footer view

     //....other code
     return cell;

 

 //if delegate is set correctly u are getting call to this method
 - (void)cellFooterViewTapped
 
    //hear u can push the controller
    NSLog(@"push hear");

 

其余代码无需更改,

希望这对你有帮助.. :)

结束编辑

【讨论】:

这是个好主意,但行不通。我不能使用self,因为我不是从继承 ViewController 的类中调用,所以我需要一种方法来获取我当前的 NavigationController 并将其推送 对不起,现在我知道你正在使用集合视图单元来呈现视图控制器仪式,显示整个 - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath: (NSIndexPath *)indexPath 的代码 将自定义委托从单元格发送到视图控制器并推送视图控制器 第一次听说自定义委托,有什么链接可以参考吗? 哦,那太好了..我很高兴能帮上忙... :) 更重要的是要知道如何创建自定义代表 .. 像上面的例子 .. :)【参考方案2】:

你需要这样做

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

你的集合视图的方法。它就像表视图didselectrow在这里你会得到视图控制器的导航控制器你可以自己访问它。

编辑

如果你使用了其他一些结构,你需要通过控制使用委托或使用块来实现它。

@property(nonatomic,copy)void(^cellSelect)(NSIndexPath*);

设置你的块并调用它 在上述方法中

self.cellSelect(indexPath);

现在,当您选择项目使用它来推送时,您将在块中调用

【讨论】:

对不起我没提(还没有喝咖啡),我已经实现了,只是我想为单元格的不同部分打开不同的视图控制器,并且知道我想要从页脚启动一些东西,我只能在 Custom CollectionViewCell 方法中访问【参考方案3】:

我回答了一个类似的问题here。如果你实现了它,你可以通过以下方式访问当前的视图控制器:

[UIViewController currentViewController];

【讨论】:

不错的递归函数,但我在findBestViewController 收到一个错误,它无法识别它,知道吗?

以上是关于如何从自定义 UICollectionViewCell 启动 View Controller的主要内容,如果未能解决你的问题,请参考以下文章

如何从自定义列表视图中获取选定项目并在 toast 消息中打印?

如何从自定义反应挂钩访问数据

如何从自定义 UIView 类调用函数?

如何从自定义 UITextView 单元中获取文本?

如何判断 UITabBar 是不是从自定义视图打开?

如何从自定义模块中正确导入函数