???????在開發(fā)過程中我們可能會(huì)遇到不同的產(chǎn)品需求,例如說A-->B--C上岗,如果是層級返回的話我們只需要pop回去就好凄鼻,但是如果是back到指定VC的時(shí)候,例如:A-->B--C喂分,然后從C回到A锦庸,在開發(fā)過程中還是遇到的比較多的,本文總結(jié)了常見的三種方法蒲祈,以此記錄一下甘萧。
使用場景: A -- > B -- > C,然后現(xiàn)在要求C直接pop回到A梆掸。
方法一
C返回到B的時(shí)候?qū)憘€(gè)回調(diào)扬卷,B接收到回調(diào)再自己pop到A,但是這個(gè)方法B的頁面會(huì)閃現(xiàn)一下酸钦,用戶體驗(yàn)不好怪得,不推薦。
實(shí)現(xiàn)代碼:
C_ViewController.h
#import <UIKit/UIKit.h>
typedef void (^backBlock)(void);
@interface C_ViewController : UIViewController
@property (copy,nonatomic)backBlock backBlock;
@end
C_ViewController.m
-(void)back
{
if (self.backBlock) {
[self.navigationController popViewControllerAnimated:YES];
self.backBlock();
}
}
B_ViewController實(shí)現(xiàn)方法
C_ViewController *cViewController = [[C_ViewController alloc] init];
[self.navigationController pushViewController:cViewController animated:YES];
cViewController.backBlock = ^{
[self.navigationController popViewControllerAnimated:YES];
};
方法二
在B push 到C的時(shí)候卑硫,直接把B從導(dǎo)航控制器的堆棧中移除徒恋。
實(shí)現(xiàn)方法:
B_ViewController實(shí)現(xiàn)方法
// 方法二
NSMutableArray *arrM = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
[arrM replaceObjectAtIndex:[arrM count]-1 withObject:cViewController];
[self.navigationController setViewControllers:arrM animated:YES];
方法三
寫一個(gè)UIViewController的catrgory,在C的backAct方法中使用
實(shí)現(xiàn)方法:
UIViewController+BackToViewController.h
#import <UIKit/UIKit.h>
@interface UIViewController (BackToViewController)
-(void)backToController:(NSString *)controllerName animated:(BOOL )animaed;
@end
UIViewController+BackToViewController.m
@implementation UIViewController (BackToViewController)
-(void)backToController:(NSString *)controllerName animated:(BOOL)animaed{
if (self.navigationController) {
NSArray *controllers = self.navigationController.viewControllers;
NSArray *result = [controllers filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id _Nullable evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
return [evaluatedObject isKindOfClass:NSClassFromString(controllerName)];
}]];
if (result.count > 0) {
[self.navigationController popToViewController:result[0] animated:YES];
}
}
}
在C_ViewController中使用
// 方法三
if(self.navigationController.viewControllers.count <= 1)
{
[self dismissViewControllerAnimated:YES completion:nil];
}
else
{
[self backToController:@"ViewController" animated:YES];
}
這是我個(gè)人用的三種方法拔恰,比較推薦第三種方法因谎,如有更好的方法麻煩告知,大家共同進(jìn)步颜懊,謝謝财岔。