如何从自定义UICollectionViewCell启动View Controller

时间:2014-07-22 08:25:22

标签: ios xcode viewcontroller

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

仅限于此示例

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

知道我该怎么做?

这就是我通常拨打cell点击

的方式
- (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类中获取点击事件。

3 个答案:

答案 0 :(得分:2)

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

你可以这样做,

- (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]; 
} 

修改 在自定义单元格中定义自定义委托,例如我举了一个例子 CustomCollectionVIewCellCustomCollectionVIewCell.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
<{1>}文件中的

ViewController.m

其余代码因为无需更改,

希望这有助于你......:)

结束编辑

答案 1 :(得分:0)

您需要在

中执行此操作
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

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

修改

如果您使用了其他一些结构,并且需要传递controll,请使用委托或使用块来实现它。

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

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

self.cellSelect(indexPath);

现在,当您选择项目使用它来推送

时,您将收到阻止

答案 2 :(得分:0)

我回答了类似的问题here。如果实现了该功能,则可以通过执行以下操作来访问当前视图控制器:

[UIViewController currentViewController];