欢迎来到 IT实训基地-南通科迅教育
咨询电话:0513-81107100
iOS开发——代码生成TabBar与视图切换详解
2017/4/17
南通科迅教育
540
南通零基础IT培训班怎样选择

我在之前多篇博客中讲解了在不使用storyboard而使用nib文件的情况下,使用代码生成导航栏并进行跳转,具体可以参考《iOS开发——界面跳转与返回及视图类型详解》《iOS纯代码实现界面建立、跳转、导航栏(无storyboard、无nib)(Objective-C)》。今天我来讲解下在使用nib搭建界面的情况下,用代码生成TabBar,并进行界面之间的跳转。代码示例已经上传至:https://github.com/chenyufeng1991/TabBarTest 。

(1)在该示例中,Navigation和TabBar都会通过代码来实现,所以需要在AppDelegate中初始化设置如下:其中RootViewController是在后面定义的一个根视图。

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#import"AppDelegate.h"
#import"RootViewController.h"
 
@interfaceAppDelegate ()
 
@end
 
@implementationAppDelegate
 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 
  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
 
  //声明根视图;
  RootViewController *root = [[RootViewController alloc]init];
  self.window.rootViewController = root;
 
  [self.window makeKeyAndVisible];
 
  returnYES;
}
 
@end


 

(2)RootViewController定义了根视图,在这里定义了页面的Navigation和TabBar。这是我们第一个看到的视图。

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#import"RootViewController.h"
#import"FirstViewController.h"
#import"SecondViewController.h"
 
@interfaceRootViewController ()<uitabbarcontrollerdelegate>
 
//声明TabBar
@property(nonatomic,strong)UITabBarController *tabBarController;
 
@end
 
@implementationRootViewController
 
- (void)viewDidLoad
{
  [superviewDidLoad];
 
  UITabBarController *tabBarController = [[UITabBarController alloc]init];
  tabBarController.delegate = self;
  /**
   把两个界面加入到根视图中;
   两个界面也分别要导航栏;
   */
  FirstViewController *firstVC = [[FirstViewController alloc]init];
  UINavigationController *firstNav = [[UINavigationController alloc]initWithRootViewController:firstVC];
  firstNav.tabBarItem = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemRecents tag:0];
 
  SecondViewController *secondVC = [[SecondViewController alloc]init];
  UINavigationController *secondNav = [[UINavigationController alloc]initWithRootViewController:secondVC];
  secondNav.tabBarItem = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemSearch tag:1];
 
  //通过数组存储;
  tabBarController.viewControllers = [NSArray arrayWithObjects:firstNav,secondNav, nil];
 
  self.tabBarController = tabBarController;
  [self.view addSubview:tabBarController.view];
}
 
@end</uitabbarcontrollerdelegate>

(3)TabBar的第一个Tab实现如下,我这里通过一个按钮以push方式跳到另一个页面(也会出现导航栏和TabBar)。

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#import"FirstViewController.h"
#import"First02ViewController.h"
 
@interfaceFirstViewController ()
 
@end
 
@implementationFirstViewController
 
- (void)viewDidLoad {
  [superviewDidLoad];
 
  self.title = @"1111";
 
}
 
- (IBAction)buttonPressed:(id)sender {
 
  //通过push跳到另一个界面;
  First02ViewController *first02 = [[First02ViewController alloc] init];
  [self.navigationController pushViewController:first02 animated:true];
 
}
 
@end

(4)在上述push到另一个界面后,可以使用导航栏自带的“返回”按钮返回,也可以通过pop返回:

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#import"First02ViewController.h"
 
@interfaceFirst02ViewController ()
 
@end
 
@implementationFirst02ViewController
 
- (void)viewDidLoad {
  [superviewDidLoad];
 
  self.title = @"新闻";
 
}
 
- (IBAction)backButtonPressed:(id)sender {
 
  //通过pop返回到push过来的界面;
  [self.navigationController popViewControllerAnimated:true];
}
 
@end


 

(5)在第二个Tab中,我通过点击按钮以Modal方式跳转到另一个页面(该页面没有导航栏,没有TabBar)。

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#import"SecondViewController.h"
#import"Second02ViewController.h"
 
@interfaceSecondViewController ()
 
@end
 
@implementationSecondViewController
 
- (void)viewDidLoad {
  [superviewDidLoad];
 
  self.title = @"2222";
 
}
 
- (IBAction)buttonPressed:(id)sender {
 
  //通过modal方式跳转,跳过去后的界面没有导航栏;
  Second02ViewController *second02 = [[Second02ViewController alloc] init];
  [self presentViewController:second02 animated:truecompletion:nil];
 
}
 
@end

然后通过dismiss返回。

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#import"Second02ViewController.h"
 
@interfaceSecond02ViewController ()
 
@end
 
@implementationSecond02ViewController
 
- (void)viewDidLoad {
  [superviewDidLoad];
 
}
 
- (IBAction)backButtonPressed:(id)sender {
 
  //通过dismiss返回modal过来的界面;
  [self dismissViewControllerAnimated:truecompletion:nil];
 
}
 
@end


 

直接看上面的代码可能有点乱,你可以通过下载源代码运行后查看。这个也可以作为界面的架构直接使用,但是如果你想用storyboard来开发,也是极为方便的。

77
关闭
先学习,后交费申请表
每期5位名额
在线咨询
免费电话
QQ联系
先学习,后交费
TOP
您好,您想咨询哪门课程呢?
关于我们
机构简介
官方资讯
地理位置
联系我们
0513-91107100
周一至周六     8:30-21:00
微信扫我送教程
手机端访问
南通科迅教育信息咨询有限公司     苏ICP备15009282号     联系地址:江苏省南通市人民中路23-6号新亚大厦三楼             法律顾问:江苏瑞慈律师事务所     Copyright 2008-