3 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊
根據(jù)一些評(píng)論,原始答案中的解決方案在iOS 8+中的某些情況下似乎不起作用。如果沒(méi)有更多詳細(xì)信息,我無(wú)法驗(yàn)證實(shí)際情況。
對(duì)于那些在那種情況下的人,還有另一種選擇。可以通過(guò)覆蓋檢測(cè)何時(shí)彈出視圖控制器willMove(toParentViewController:)。基本思想是在parentis 時(shí)彈出視圖控制器nil。
請(qǐng)查看“實(shí)現(xiàn)Container View Controller”以了解更多詳細(xì)信息。
從iOS 5開(kāi)始,我發(fā)現(xiàn)處理這種情況的最簡(jiǎn)單方法是使用新方法- (BOOL)isMovingFromParentViewController:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (self.isMovingFromParentViewController) {
// Do your stuff here
}
}
- (BOOL)isMovingFromParentViewController 當(dāng)您在導(dǎo)航堆棧中推入和彈出控制器時(shí)很有意義。
但是,如果要呈現(xiàn)模式視圖控制器,則應(yīng)- (BOOL)isBeingDismissed改用:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (self.isBeingDismissed) {
// Do your stuff here
}
}
如本問(wèn)題所述,您可以結(jié)合使用以下兩個(gè)屬性:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (self.isMovingFromParentViewController || self.isBeingDismissed) {
// Do your stuff here
}
}
其他解決方案依賴于的存在UINavigationBar。相反,更喜歡我的方法,因?yàn)樗箞?zhí)行任務(wù)所需的任務(wù)與觸發(fā)事件的操作(即按后退按鈕)分離。

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊
雖然viewWillAppear()和viewDidDisappear() 被當(dāng)返回按鈕被竊聽(tīng)叫,它們也被稱為在其他時(shí)間。有關(guān)更多信息,請(qǐng)參見(jiàn)答案結(jié)尾。
使用UIViewController.parent
當(dāng)借助willMoveToParentViewController(_:)OR 將VC從其父級(jí)(NavigationController)中刪除時(shí),最好檢測(cè)到后退按鈕didMoveToParentViewController()
如果parent為零,則將視圖控制器從導(dǎo)航堆棧中彈出并關(guān)閉。如果parent不為nil,則將其添加到堆棧中并顯示。
// Objective-C
-(void)willMoveToParentViewController:(UIViewController *)parent {
[super willMoveToParentViewController:parent];
if (!parent){
// The back button was pressed or interactive gesture used
}
}
// Swift
override func willMove(toParent parent: UIViewController?) {
super.willMove(toParent: parent)
if parent == nil {
// The back button was pressed or interactive gesture used
}
}
換出willMove了didMove和檢查self.parent做工作后視圖控制器被駁回。
停止解雇
請(qǐng)注意,如果需要執(zhí)行某種異步保存,則檢查父級(jí)不允許您“暫停”過(guò)渡。為此,您可以實(shí)現(xiàn)以下內(nèi)容。唯一的缺點(diǎn)是,您失去了精美的iOS樣式/動(dòng)畫(huà)后退按鈕。在此處也要小心使用交互式滑動(dòng)手勢(shì)。使用以下內(nèi)容處理這種情況。
var backButton : UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
// Disable the swipe to make sure you get your chance to save
self.navigationController?.interactivePopGestureRecognizer.enabled = false
// Replace the default back button
self.navigationItem.setHidesBackButton(true, animated: false)
self.backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "goBack")
self.navigationItem.leftBarButtonItem = backButton
}
// Then handle the button selection
func goBack() {
// Here we just remove the back button, you could also disabled it or better yet show an activityIndicator
self.navigationItem.leftBarButtonItem = nil
someData.saveInBackground { (success, error) -> Void in
if success {
self.navigationController?.popViewControllerAnimated(true)
// Don't forget to re-enable the interactive gesture
self.navigationController?.interactivePopGestureRecognizer.enabled = true
}
else {
self.navigationItem.leftBarButtonItem = self.backButton
// Handle the error
}
}
}
將顯示更多視圖
如果您沒(méi)有遇到viewWillAppear viewDidDisappear問(wèn)題,我們來(lái)看一個(gè)例子。假設(shè)您有三個(gè)視圖控制器:
ListVC:事物的表視圖
DetailVC:關(guān)于事物的詳細(xì)信息
SettingsVC:某些選項(xiàng)
detailVC當(dāng)您從listVC轉(zhuǎn)到settingsVC并返回到時(shí),可以跟蹤上的呼叫l(wèi)istVC
列表>詳細(xì)信息(按下detailVC)Detail.viewDidAppear<-出現(xiàn)
詳細(xì)信息>設(shè)置(按下settingsVC)Detail.viewDidDisappear<-消失
然后回頭...
設(shè)置>詳細(xì)信息(彈出設(shè)置 VC)<- Detail.viewDidAppear出現(xiàn)
詳細(xì)信息>列表(彈出詳細(xì)信息 VC)Detail.viewDidDisappear<-消失
請(qǐng)注意,viewDidDisappear不僅在返回時(shí),而且在前進(jìn)時(shí),都會(huì)多次調(diào)用它。對(duì)于可能需要的快速操作,但是對(duì)于更復(fù)雜的操作(例如要保存的網(wǎng)絡(luò)呼叫),可能不需要。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
第一種方法
- (void)didMoveToParentViewController:(UIViewController *)parent
{
if (![parent isEqual:self.parentViewController]) {
NSLog(@"Back pressed");
}
}
第二種方法
-(void) viewWillDisappear:(BOOL)animated {
if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
// back button was pressed. We know this is true because self is no longer
// in the navigation stack.
}
[super viewWillDisappear:animated];
}
- 3 回答
- 0 關(guān)注
- 820 瀏覽
添加回答
舉報(bào)