iOS-CコントローラはAコントローラに戻ります
3252 ワード
もしあなたのAコントローラがちょうど
方法1:
考え方:1.Bコントローラにコールバックblockを書き、callbackBlockと命名すると仮定します.
2.AコントローラでBコントローラのcallbackBlockに値を割り当てます.
3.元々はBコントローラpush Cコントローラにありました.実際には、Bコントローラで
4.AコントローラでPushメソッドを実行し、AコントローラからCコントローラにpushを実行すると、Cコントローラが戻ってくると、Aコントローラに直接着きます.私たちの目的も達成しました.
コアコードはA、Bの2つのコントローラにあり、具体的な例コードは以下の通りである:Aコントローラコード:
Bコントローラコード:
方式2
コメントエリアの大神の指摘を受けて、ここではもう一つのAコントローラに戻る方法を提供して、コアコードはCコントローラクラスの中で、コードは以下の通りです:
コアコードはCコントローラにあり、以下の通り:Cコントローラコード:
2つの方法の使用感
しばらくの間使用して、筆者はこの2つの方法がそれぞれ少しあることを発見しました.前者はここでコードが多いように見えますが、実際の運用ではコード量に匹敵します.筆者は第1の方法が第2の方法より優れていると感じた.具体的にどの方法がいいのか、実践してからの返事を楽しみにしています.
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の方法より優れていると感じた.具体的にどの方法がいいのか、実践してからの返事を楽しみにしています.