通过单击自定义单元格中的按钮转到另一个视图
Go to another view by clicking a button in Custom Cell
我创建了自定义单元格 (XIB) 作为 UICollectionViewCell
的子类,该单元格中有一个按钮。当我单击一个按钮时,我想转到另一个包含一些数据的视图,并且也可以通过单击一个按钮返回到原始视图。我搜索了它并找到了类似 "segue" 或 "modal" 的内容,但我最初无法从我的自定义单元格中执行此操作。
有什么办法吗?任何帮助将不胜感激。
最简单的方法是实施 cellForRow..
方法,为您的 cell/button 设置标签并根据该标签做出反应(例如 indexPath.row
)。
您不能在单元格中执行导航作业t/shouldn,导航不在单元格域中。
你可以尝试的是
1) 使用委托,设置委托并将其连接到按钮操作,托管 tableview/collection 视图的控制器可以将自己设置为委托并监听任何事件。该控制器应负责使用您想要的任何方法将新视图推送到堆栈。
2) 如果你讨厌委托但喜欢块,你可以在单元格上设置一个回调块,它的动作可以在控制器的 cellForRowAtIndex: 方法中设置。
注意到这里的规律了吗?以上两种方法都是将任务从单元委托给控制器。
如果都失败了,就实施didSelectItemAtIndexPath:
并坚持下去。
你试过 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];
}
1.custom 你的按钮
NouMapButton.h
#import <Foundation/Foundation.h>
@interface NouMapButton : UIButton
@property (nonatomic, readwrite, retain) NSObject *dataObj;
@end
NouMapButton.m
#import "NouMapButton.h"
@implementation NouMapButton
@end
在
中设置按钮数据和目标
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
btn01.dataObj = YOUR_DATA;
[btn01 addTarget:self action:@selector(map:) forControlEvents:UIControlEventTouchUpInside];
然后就可以在sender.dataObj
中获取按钮自定义dataObj
-(void)map:(NouMapButton *)sender{
MapViewController *nextView = [[MapViewController alloc] init];
nextView.dataObj = sender.dataObj;
//TODO....
}
所以你想做的是,因为 UICollectionView 看起来和 UITableView 一样工作,所以你要做的是创建一个 UICollectionViewCell 的子class,它包含一个 protocol 来发送动作,如按下按钮,从不同的视图到视图控制器。在这种情况下,另一个视图是 UICollectionViewCell。
向 UICollectionViewCell 添加协议
添加一个名为 UICustomCollectionViewCell 的新 Cocoa Touch Class 子class of UICollectionViewCell。并包含 界面生成器文件
头文件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 的按钮:
- 按钮
- -按下按钮:
最后,在你的项目中使用这个class
导入 class 以及委托:
#import "UICustomCollectionViewCell.h"
@interface ViewController () < UICustomCollectionViewCellDelegate>
@end
在下面的代码中,您将使用 UICustomCollectionViewCell class 而不是 UICollectionViewCell:
UICustomCollectionViewCell *cell;
...
[cell setDelegate: self];
...
return cell;
现在按下按钮时调用的操作或方法:
- (void)customCollectionViewCell:(UICustomCollectionViewCell *)cell pressedButton:(UIButton *)button {
//action will be here when the button is pressed
}
如果您想了解此单元格的索引路径:
[collectionView indexPathForCell: cell];
我创建了自定义单元格 (XIB) 作为 UICollectionViewCell
的子类,该单元格中有一个按钮。当我单击一个按钮时,我想转到另一个包含一些数据的视图,并且也可以通过单击一个按钮返回到原始视图。我搜索了它并找到了类似 "segue" 或 "modal" 的内容,但我最初无法从我的自定义单元格中执行此操作。
有什么办法吗?任何帮助将不胜感激。
最简单的方法是实施 cellForRow..
方法,为您的 cell/button 设置标签并根据该标签做出反应(例如 indexPath.row
)。
您不能在单元格中执行导航作业t/shouldn,导航不在单元格域中。
你可以尝试的是
1) 使用委托,设置委托并将其连接到按钮操作,托管 tableview/collection 视图的控制器可以将自己设置为委托并监听任何事件。该控制器应负责使用您想要的任何方法将新视图推送到堆栈。
2) 如果你讨厌委托但喜欢块,你可以在单元格上设置一个回调块,它的动作可以在控制器的 cellForRowAtIndex: 方法中设置。
注意到这里的规律了吗?以上两种方法都是将任务从单元委托给控制器。
如果都失败了,就实施didSelectItemAtIndexPath:
并坚持下去。
你试过 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];
}
1.custom 你的按钮
NouMapButton.h
#import <Foundation/Foundation.h>
@interface NouMapButton : UIButton
@property (nonatomic, readwrite, retain) NSObject *dataObj;
@end
NouMapButton.m
#import "NouMapButton.h"
@implementation NouMapButton
@end
在
中设置按钮数据和目标-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath btn01.dataObj = YOUR_DATA; [btn01 addTarget:self action:@selector(map:) forControlEvents:UIControlEventTouchUpInside];
然后就可以在sender.dataObj
中获取按钮自定义dataObj-(void)map:(NouMapButton *)sender{ MapViewController *nextView = [[MapViewController alloc] init]; nextView.dataObj = sender.dataObj; //TODO.... }
所以你想做的是,因为 UICollectionView 看起来和 UITableView 一样工作,所以你要做的是创建一个 UICollectionViewCell 的子class,它包含一个 protocol 来发送动作,如按下按钮,从不同的视图到视图控制器。在这种情况下,另一个视图是 UICollectionViewCell。
向 UICollectionViewCell 添加协议
添加一个名为 UICustomCollectionViewCell 的新 Cocoa Touch Class 子class of UICollectionViewCell。并包含 界面生成器文件
头文件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 的按钮:
- 按钮
- -按下按钮:
最后,在你的项目中使用这个class
导入 class 以及委托:
#import "UICustomCollectionViewCell.h"
@interface ViewController () < UICustomCollectionViewCellDelegate>
@end
在下面的代码中,您将使用 UICustomCollectionViewCell class 而不是 UICollectionViewCell:
UICustomCollectionViewCell *cell;
...
[cell setDelegate: self];
...
return cell;
现在按下按钮时调用的操作或方法:
- (void)customCollectionViewCell:(UICustomCollectionViewCell *)cell pressedButton:(UIButton *)button {
//action will be here when the button is pressed
}
如果您想了解此单元格的索引路径:
[collectionView indexPathForCell: cell];