一衷掷、應(yīng)用場(chǎng)景
我們需求是push之后一個(gè)界面,再pop回來(lái),需要檢測(cè)一下柿菩,如果不符合戚嗅,就再Pop回去。(其實(shí)這樣的動(dòng)畫(huà)也不是太好。)
二懦胞、正常的敲代碼
A push B push C
[self.navigationController popViewControllerAnimated:YES]; // C回來(lái)
if (YES) { // 某種檢測(cè)邏輯(聯(lián)網(wǎng)檢測(cè)) B頁(yè)面
[self.navigationController popViewControllerAnimated:YES]; // 連續(xù)pop
}
這時(shí)候我們驚人的發(fā)現(xiàn)替久,iOS7的機(jī)子crash。這時(shí)候內(nèi)心是抓狂的躏尉。頓時(shí)覺(jué)得蚯根,這什么破需求碰上了系統(tǒng)沒(méi)有優(yōu)化的bug(iOS8以上(含)系統(tǒng)已自動(dòng)修復(fù))。
這時(shí)候我們解決辦法就是等上一個(gè)pop結(jié)束胀糜。再檢測(cè)pop颅拦。上一個(gè)pop結(jié)束的時(shí)機(jī)就是B頁(yè)面viewDidAppear
和C頁(yè)面的viewDidDisappear
三、黑魔法給pop添加完成回調(diào)
給UIViewController
交換方法實(shí)現(xiàn)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[self swizzleOriginMethod:@selector(viewDidDisappear:) anotherSelecor:@selector(xks_viewDidDisappear:)];
});
}
- (void)xks_viewDidDisappear:(BOOL)animated {
[super xks_viewDidDisappear:animated];
void(^popCompeletion)() = objc_getAssociatedObject(self, @"popCompeletion");
if (popCompeletion) {
popCompeletion();
}
}
給UINavigationController
給增加分類(lèi),pop回調(diào)
- (void)popViewControllerAnimated:(BOOL)animated compeletion:(void(^)())compeletion {
UIViewController *topVC = self.topViewController;
__weak typeof(topVC) weakTopVC = topVC;
void(^popCompeletion)() = ^{
__strong typeof(weakTopVC) topVC = weakTopVC;
BOOL directPop = [objc_getAssociatedObject(topVC, @"directPop") boolValue];
if (!directPop) { // 預(yù)防compeletion被多次執(zhí)行
objc_setAssociatedObject(topVC, @"directPop", @(YES), OBJC_ASSOCIATION_ASSIGN);
if (compeletion) {
compeletion();
}
}
};
objc_setAssociatedObject(topVC, @"popCompeletion", popCompeletion, OBJC_ASSOCIATION_COPY_NONATOMIC);
[self popViewControllerAnimated:animated];
}
四教藻、優(yōu)雅的使用
給目標(biāo)C植入block
__weak typeof(self) weakSelf = self;
cVC.compeletion = ^{
__strong typeof(weakSelf) self = weakSelf;
// C回來(lái)之后距帅,再pop
[self.navigationController popViewControllerAnimated:YES compeletion:{
if (YES) { // 某種檢測(cè)邏輯(聯(lián)網(wǎng)檢測(cè)) B頁(yè)面
[self.navigationController popViewControllerAnimated:YES]; // 連續(xù)pop,pop到A
}
}];
};