一、Modal
Modal方式一:代碼
1.打開模態控制器
[self presentViewController:login animated:YES completion:^{NSLog(@"彈出完畢");}];
2.關閉模態控制器
[self dismissViewControllerAnimated:YES completion:nil];
Modal方式二:storyboard
在storyboard中托出兩個ViewController:ViewController 和 NextViewController
按住CTRL 點擊ViewController 中的button 指向 NextViewController,在彈出中選擇Modal
------------、控制器之間傳值----------------
傳值方式一:直接複雜,缺點 耦合性太高
例子說明:在Modal,取呈現的控制器(presentingViewController)對象直接賦值
- (IBAction)loginToMain:(id)sender {
// 1.取出用戶名,並傳回上一個控制器
NSString *text = self.username.text;
ViewController *back =(ViewController *)self.presentingViewController;
back.userName.text=text;
//[self.delegate loginSuccess:text];
// 2.關閉當前控制器
[self dismissViewControllerAnimated:YES completion:nil];
}
傳值方式二: 代理 說明:ViewController作爲代理,LoginViewController中定義代理
步驟一:LoginViewController.h中定義協議
@protocol LoginViewControllerDelegate;
@interface LoginViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *username;
- (IBAction)back:(id)sender;
- (IBAction)loginToMain:(id)sender;
// 代理用weak
@property (nonatomic, weak) id<LoginViewControllerDelegate> delegate;
@end
@protocol LoginViewControllerDelegate <NSObject>
- (void)loginSuccess:(NSString *)usernameText;
@end
步驟二:ViewController.h繼承協議
@protocol LoginViewControllerDelegate;
@interface ViewController : UIViewController<LoginViewControllerDelegate>
@end
步驟三:ViewController.m chu 綁定代理,並實現接受消息方法loginSucess
// 初始化控制器
LoginViewController *login = [[LoginViewController alloc] init];
login.delegate = self;
// 彈出登錄界面
[self presentViewController:login animated:YES completion:^{
NSLog(@"彈出完畢");
}];
#pragma mark LoginViewControllerDelegate方法
- (void)loginSuccess:(NSString *)usernameText
{
// NSLog(@"%@",usernameText);
self.userName.text=usernameText;
}
步驟四:LoginViewController.m 觸發代理方法
[self.delegateloginSuccess:text];
二、push 用到導航控制器UINavigationController 類似 棧
方式一 代碼:
MJAppDelegate.m中 創建導航控制器,並設置MJViewController爲第一個控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
// 創建導航控制器(並且設置MJViewController是第一個子控制器)
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.viewController];
//NSLog(@"nav=%@", nav);
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
return YES;
}
導航控制器掌握:
1.創建導航控制器
[[UINavigationController alloc] initWithRootViewController:self.viewController];
2.棧(棧中所有的子控制器)
self.navigationController.viewControllers;
3.將控制器壓入棧中
[self.navigationController pushViewController:second animated:YES];
4.將控制器從棧中彈出
1> 將棧頂控制器彈出
[self.navigationController popViewControllerAnimated:YES];
2> 回到棧底控制器(根控制器)
[self.navigationController popToRootViewControllerAnimated:YES];
3> 回到具體某一個控制器
[self.navigationController popToViewController:<#(UIViewController *)#> animated:<#(BOOL)#>];
5.導航欄顯示的內容
1> 棧頂控制器的navigationItem屬性決定了導航欄上面顯示的東西
2> 導航欄左邊的返回鍵,是由上一個控制器決定
6.棧頂控制器
self.navigationController.topViewController
// 棧頂控制器的navigationItem屬性決定了導航欄上面顯示的東西
// 導航欄左邊的返回鍵,是由上一個控制器決定
self.navigationItem.title = @"MJViewController";
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nil action:nil];
// 設置下一個界面的返回按鈕
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];
方式二 :storyboard
// 跳到下一個控制器 (執行對應的線):VIew 對 View拖,push的線;“ogin_success”對於線的identifier
[selfperformSegueWithIdentifier:@"login_success"sender:nil];
在執行segue之前會調用一個方法
#pragma mark 執行segue之前會先調用一下這個方法
// 可以給下一個控制器傳遞數據
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//segue.sourceViewController; // 來源控制器
//segue.destinationViewController; // 目的控制器
NSLog(@"%@", segue.sourceViewController);
NSLog(@"%@", segue.destinationViewController);
}
二、UITabBarController
1.UITabbarController的所有子控制器:viewControllers
2.UITabbarController可以設置delegate,監聽切換過程
3.每個標籤顯示的內容由當前子控制器的tabbarItem屬性決定
self.tabBarItem.title = @"MJView"; // 文字
self.tabBarItem.badgeValue = @"5"; // 紅色數字
self.tabBarItem.image // 圖片