在平常的项目中,我们经常会用到从自定义的cell或者view跳转到控制器,那么我们该怎么进行跳转呢?
1、要想从自定义的view进行跳转,那么你肯定在view定义了按钮来执行方法吧,既然这样,那你可以直接在控制器中通过自定义的view得到按钮,然后通过为按钮添加方法执行跳转.
2、找到view的控制器,返回view所加载在的控制器(重定向),这样你就可以直接在view里拿到控制器进行跳转了.具体代码如下
//找到view所在的控制器
- (UIViewController *)viewController {
for (UIView* next = [self superview]; next; next = next.superview) {
UIResponder *nextResponder = [next nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]]) {
return (UIViewController *)nextResponder;
}
}
return nil;
}
//通过找到的控制器进行跳转
-(void)TestButtonClick:(UIButton *)button {
TestViewController *vc = [[TestViewController alloc]init] ;
vc.hidesBottomBarWhenPushed = YES ;
[[self viewController].navigationController pushViewController:vc animated:YES] ;
}
其实自定义view的跳转还算好弄,但是当我们自定义的tableViewCell中又嵌套了collectionViewCell的时候又该怎么进行跳转呢?
3、最省脑子的方法就是不要把collectionViewCell的定义放在自定义的tableViewCell的文件中,而是在控制器中tableViewCell的DataSource必须实现的方法里去定义,这样的话也就可以在collectionViewCell的点击方法里拿到控制器控制器进行跳转了.但是,这样会使控制器显得特别臃肿,而且也违背了封装的原理,所以并不建议这么做.当然,你要是非要这么做,那么功能也是可以实现的,没有任何问题.
4、使用通知进行跳转.是的,没错,使用通知来进行跳转!在自定义的tableViewCell文件中添加collectionViewCell(这种做法才是被鼓励的),并在collectionViewCell的点击方法里创建通知.具体代码如下:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
//userInfo是一个字典,里面包含了跳转到的另一个控制器里需要的链接
[[NSNotificationCenter defaultCenter] postNotificationName:@"shouye" object:self userInfo:@{@"url":self.detialUrl[indexPath.item]}];
}
然后在tableViewCell所在的控制器视图将要显示的时候添加通知
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.navigationController.navigationBar.hidden = NO;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tiaozhaun:) name:@"shouye" object:nil];
}
并实现通知的方法
- (void)tiaozhaun:(NSNotification *)index{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"shouye" object:nil];
NSString * url = index.userInfo[@"url"];
danGeTableViewController * dg = [[danGeTableViewController alloc]init];
dg.url = url;
dg.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:dg animated:YES];
}
这样,我们就实现了从跳转,但是在高兴之余别忘了一件事,那就是在控制器的dealloc方法里移除通知
5、使用block块进行跳转.熟悉iOS的人肯定都知道block,那么怎么使用block进行跳转呢?
//首先在tableViewCell.h中定义block
typedef void(^tiaozhuan)();
//并将block定义成属性
@property(nonatomic,copy)tiaozhuan tiaozhuan;
然后再collectionViewCell的didSelectItemAtIndexPath方法调用block
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
self.tiaozhuan();
}
最后在控制器的tableViewCell的的数据源方法里调用block快进行跳转就可以了.
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) {
cell = [[TableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
cell.tiaozhuan = ^(NSInteger num){
ViewController *viewC = [[ViewController alloc]init];
[self.navigationController pushViewController:viewC animated:YES];
};
cell.backgroundColor = [UIColor yellowColor];
return cell;
}
详细见图: