iOS-CコントローラはAコントローラに戻ります

3252 ワード

もしあなたのAコントローラがちょうどRootViewControllerではない場合、CコントローラからAコントローラに戻るにはどうすればいいですか?popToRootViewControllerAnimated :メソッドは使用できないことは明らかです.筆者は2つの方法を提供し、使用方法2を推奨する.
方法1:
考え方:1.Bコントローラにコールバックblockを書き、callbackBlockと命名すると仮定します.
2.AコントローラでBコントローラのcallbackBlockに値を割り当てます.
3.元々はBコントローラpush Cコントローラにありました.実際には、BコントローラでpopViewControllerAnimated:メソッド(注意:メソッドパラメータをNOに設定)を実行し、popViewControllerAnimated:メソッドの次の行のコードでcallback Blockを実行します.コードを実行させ、戻ってくるAコントローラです.
4.AコントローラでPushメソッドを実行し、AコントローラからCコントローラにpushを実行すると、Cコントローラが戻ってくると、Aコントローラに直接着きます.私たちの目的も達成しました.
コアコードはA、Bの2つのコントローラにあり、具体的な例コードは以下の通りである: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 *)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 

@interface BController : UIViewController
/**   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 *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    
    //   :        ,         
    [self.navigationController popViewControllerAnimated:NO];
    
    // block  nil   
    if (_callbackBlock != nil) _callbackBlock();
}

@end

方式2
コメントエリアの大神の指摘を受けて、ここではもう一つの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 *)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

2つの方法の使用感
しばらくの間使用して、筆者はこの2つの方法がそれぞれ少しあることを発見しました.前者はここでコードが多いように見えますが、実際の運用ではコード量に匹敵します.筆者は第1の方法が第2の方法より優れていると感じた.具体的にどの方法がいいのか、実践してからの返事を楽しみにしています.