如果你的A控制器剛好不是RootViewController
時(shí)捕发,那么該如何從C控制器返回到A控制器呢猴娩?顯然popToRootViewControllerAnimated :
方法不能使用。筆者提供兩種方法,推薦使用方式二。
方式一:
思路:
1.在B控制器寫一個(gè)回調(diào)block,假設(shè)命名為callbackBlock
2.在A控制器中給B控制器的callbackBlock賦值沛膳。
3.原本是在B控制器push C控制器的。其實(shí)我們可以這樣汛聚,在B控制器執(zhí)行popViewControllerAnimated:
方法(注意:方法參數(shù)設(shè)置為NO)锹安,接著在popViewControllerAnimated:
方法的下一行代碼執(zhí)行callbackBlock。迫使代碼執(zhí)行又回到的A控制器。
4.在A控制器執(zhí)行push方法叹哭,從A控制器push到C控制器忍宋,這樣一來,你在C控制器返回時(shí)风罩,就直接到A控制器了糠排。我們的目的也就達(dá)到了。
核心代碼在A超升、B兩控制器中入宦,具體實(shí)例代碼如下:
A控制器代碼:
//A控制器.m文件
#import "AController.h"
#import "BController.h"
#import "CController.h"
@implementation AController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor purpleColor];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
BController *b_controller = [[BController alloc] init];
b_controller.callbackBlock = ^{
CController *c_controller = [[CController alloc] init];
[self.navigationController pushViewController:c_controller animated:YES];
};
[self.navigationController pushViewController:b_controller animated:YES];
}
@end
B控制器代碼:
//B控制器.h文件
#import <UIKit/UIKit.h>
@interface BController : UIViewController
/** 回調(diào)block */
@property(nonatomic, copy) void(^callbackBlock)();
@end
//B控制器.m文件
#import "BController.h"
@implementation BController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor greenColor];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
// 注意:這里返回不要?jiǎng)赢嫞駝t切換效果很難看
[self.navigationController popViewControllerAnimated:NO];
// block不為nil時(shí)回調(diào)
if (_callbackBlock != nil) _callbackBlock();
}
@end
方式二
受評(píng)論區(qū)大神指點(diǎn)室琢,這里提供另外一種返回到A控制器的方法乾闰,核心代碼在C控制器類中,代碼如下:
核心代碼在C控制器中盈滴,如下:
C控制器代碼:
//C控制器.m文件
#import "CController.h"
#import "AController.h"
@implementation CController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor yellowColor];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
for (UIViewController *controller in self.navigationController.viewControllers) {
if ([controller isKindOfClass:[AController class]]) {
[self.navigationController popToViewController:controller animated:YES];
}
}
}
@end
兩種方式的使用感受
經(jīng)過一段時(shí)間使用涯肩,筆者發(fā)現(xiàn),這兩種方法各有各的有點(diǎn)雹熬。前者在這里看起來代碼多宽菜,但是實(shí)際運(yùn)用中谣膳,代碼量不相上下竿报。筆者感覺第一種方法優(yōu)于第二種。具體哪個(gè)方式更好继谚,期待你實(shí)踐之后的回復(fù)哦烈菌!