单击“自定义单元格”中的按钮转到另一个视图

时间:2015-07-16 15:11:25

标签: ios objective-c xib uicollectionviewcell

我创建了自定义单元格(XIB)作为UICollectionViewCell的子类,单元格中有一个按钮。当我单击一个按钮时,我想转到另一个视图,其中包含一些数据,并且也可以通过单击按钮返回到原始视图。我已经搜索过了,发现了类似“segue”或“modal”的内容,但我最初不能从我的自定义单元格中进行。

有没有办法做到这一点?任何帮助都会非常感激。

5 个答案:

答案 0 :(得分:2)

所以你想做什么,因为看起来UICollectionView和UITableView的工作方式相同,就是创建一个包含协议的UICollectionViewCell的子类,以便向视图发送操作,例如按下按钮控制器来自不同的视图。在这种情况下,不同的视图是UICollectionViewCell。

将协议添加到UICollectionViewCell

使用 UICollectionViewCell 的子类添加名为 UICustomCollectionViewCell 的新 Cocoa Touch类。并包含界面构建器文件

头文件UICustomCollectionViewCell.h

@protocol UICustomCollectionViewCellDelegate;

@interface UICustomCollectionViewCell : UICollectionViewCell

@property ( nonatomic, retain) IBOutlet UIButton *button;
- (IBAction)pressButton:(id)sender;

@property ( assign) id< UICustomCollectionViewCellDelegate> delegate;

@end

@protocol UICustomCollectionViewCellDelegate <NSObject>

@optional
- (void)customCollectionViewCell:(UICustomCollectionViewCell *)cell pressedButton:(UIButton *)button;

@end

实施文件UICustomCollectionViewCell.m

@implementation UICustomCollectionViewCell
@synthesize delegate;

- (IBAction)pressButton:(id)sender {
    if ([delegate respondsToSelector: @selector( customCollectionViewCell:pressedButton:)])
        [delegate customCollectionViewCell: self pressedButton: sender];

}

@end

xib文件UICustomCollectionViewCell.xib

确保 UICustomCollectionViewCell 的连接已连接到 Connections Inspector 中的按钮:

  1. 按钮
  2. -pressButton:
  3. example

    最后,在项目中使用此类

    导入类和委托:

    #import "UICustomCollectionViewCell.h"
    
    @interface ViewController () < UICustomCollectionViewCellDelegate>
    
    @end
    

    在下面的代码中,您将使用 UICustomCollectionViewCell 类而不是 UICollectionViewCell

    UICustomCollectionViewCell *cell;
    
    ...
    [cell setDelegate: self];
    ...
    
    return cell;
    

    现在按下按钮时调用的动作或方法:

    - (void)customCollectionViewCell:(UICustomCollectionViewCell *)cell pressedButton:(UIButton *)button {
        //action will be here when the button is pressed
    
    }
    

    如果你想找出这个单元格来自哪个indexPath:

    [collectionView indexPathForCell: cell];
    

答案 1 :(得分:1)

您不能/不应该在单元格中执行导航作业,导航不在单元格域中。

您可以尝试的是

1)使用委托,设置委托并将其连接到按钮操作,托管tableview / collection视图的控制器可以将自己设置为委托并监听任何事件。该控制器应该负责使用您想要的任何方法将新视图推送到堆栈。

2)如果你讨厌代表但喜欢块,你可以在单元格上设置一个回调块,它的动作可以在控制器的cellForRowAtIndex:方法中设置。

在这里注意到一种模式?上述两种方法都将任务从单元委托给控制器。

如果全部失败,只需实施didSelectItemAtIndexPath:并坚持下去。

答案 2 :(得分:1)

你尝试过didSelect方法吗?

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

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];

YourNewViewControllerClass *someViewController = [storyboard instantiateViewControllerWithIdentifier:@"YourNewVCID"];

[self presentViewController:someViewController
                     animated:YES
                   completion:nil];
}

答案 3 :(得分:0)

最简单的方法是实现>>> all_case=re.finditer(r'\|',s) >>> next(j.start() for i,j in enumerate(all_case,1) if i==23) 154 方法,为您的单元格/按钮设置标记,并根据该标记做出反应(例如。cellForRow..)。

答案 4 :(得分:0)

1.自定义按钮

NouMapButton.h

#import <Foundation/Foundation.h>

@interface NouMapButton : UIButton 
@property (nonatomic, readwrite, retain) NSObject *dataObj;
@end

NouMapButton.m

#import "NouMapButton.h"
@implementation NouMapButton
@end
  1. 中设置您的按钮数据和目标
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
    btn01.dataObj = YOUR_DATA;
    [btn01 addTarget:self action:@selector(map:) forControlEvents:UIControlEventTouchUpInside];
    
  2. 然后你可以在sender.dataObj

    中获得按钮自定义dataObj
    -(void)map:(NouMapButton *)sender{
        MapViewController *nextView = [[MapViewController alloc] init];
        nextView.dataObj = sender.dataObj;
        //TODO....
    
    
    }