首页 > 代码库 > iOS 协议使用
iOS 协议使用
这整个是一个cell,框框的放的image(有很多图片,可以左右滑动,我用iCarousel做的,这个的代理写在自定义cell类里面的)。现在需要点击图片进入下一个页面。。。。现在我点击图片,都会进入到自定义cell类里面的代理里,但是cell类里面,是不让我弹出下一个viewcontroller的。。??不然用[self.navigationController pushViewController:show animated:YES];这个方法。
最后用协议实现。当用户点击一个图片的时候,进入到cell类的iCarousel代理方法-(void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index在这里把index传给StarShowViewController,然后在StarShowViewController里面做push的动作。
(1)定义协议ImageItemDelegate.h
#import <Foundation/Foundation.h>
@protocol ImageItemDelegate <NSObject]]]]>
-(void)passItem:(NSString*)index;//把点击的是第几个image 的index 传过来
@end
@protocol ImageItemDelegate <NSObject]]]]>
-(void)passItem:(NSString*)index;//把点击的是第几个image 的index 传过来
@end
(2)在StarShowViewController.h类里面遵守协议
#import "ImageItemDelegate.h"
@interface StarShowViewController : UIViewController <UITableViewDelegate,UITableViewDataSource,ImageItemDelegate>{
UITableView *starTableView;
NSMutableArray *starArray;
}
@interface StarShowViewController : UIViewController <UITableViewDelegate,UITableViewDataSource,ImageItemDelegate>{
UITableView *starTableView;
NSMutableArray *starArray;
}
(4)在StarShowTableViewCell.h类里面声明一个代理
#import "ImageItemDelegate.h"
@interface StarShowTableViewCell : UITableViewCell <iCarouselDataSource,iCarouselDelegate,UIGestureRecognizerDelegate]]]]>
@property(nonatomic,retain)NSObject <ImageItemDelegate> *itemDelegate;//声明一个代理
@interface StarShowTableViewCell : UITableViewCell <iCarouselDataSource,iCarouselDelegate,UIGestureRecognizerDelegate]]]]>
@property(nonatomic,retain)NSObject <ImageItemDelegate> *itemDelegate;//声明一个代理
(5)在StarShowTableViewCell.m类里面传值
//选择某个image item
-(void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index{
NSLog(@"index:%ld",(long)index);
NSString *str = [NSString stringWithFormat:@"%ld",index];
UIView *view = carousel.currentItemView;
[self.itemDelegate passItem:str];//通过代理把str传到StarShowViewController类里面
}
-(void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index{
NSLog(@"index:%ld",(long)index);
NSString *str = [NSString stringWithFormat:@"%ld",index];
UIView *view = carousel.currentItemView;
[self.itemDelegate passItem:str];//通过代理把str传到StarShowViewController类里面
}
(6)在 StarShowViewController.m 里面 表的代理方法 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath设置代理
cell.itemDelegate = self;//设置代理
(7)进入到下一个viewcontroller
#pragma mark - ImageItemDelegate
//从cell那边拿到值
-(void)passItem:(NSString *)index{
ShowViewController *show = [[ShowViewController alloc] init];
show.imageIdex = index;
[self.navigationController pushViewController:show animated:YES];
}
//从cell那边拿到值
-(void)passItem:(NSString *)index{
ShowViewController *show = [[ShowViewController alloc] init];
show.imageIdex = index;
[self.navigationController pushViewController:show animated:YES];
}
----------------------
叫你好好看书,又不好好看书! 实现方法很多种:①、可以在controller里面直接给Image添加点击事件 ②、使用delegate,在当前controller里面实现即可触发点击事件 ③ block 简单 ④ 事件响应者链可以处理
第一种在这里不合适,第三种在这里还没有用过,理论上block也可以传值,考虑到block限制比较多,不使用 第四种事件响应者链不太清楚是怎么回事
iOS 协议使用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。