iOS开发——代码生成TabBar与视图切换详解

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

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

#import "AppDelegate.h"
#import "RootViewController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (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];

  return YES;
}

@end

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

#import "RootViewController.h"
#import "FirstViewController.h"
#import "SecondViewController.h"

@interface RootViewController ()<UITabBarControllerDelegate>

//声明TabBar
@property (nonatomic,strong)UITabBarController *tabBarController;

@end

@implementation RootViewController

- (void)viewDidLoad
{
  [super viewDidLoad];

  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

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

#import "FirstViewController.h"
#import "First02ViewController.h"

@interface FirstViewController ()

@end

@implementation FirstViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  self.title = @"1111";

}

- (IBAction)buttonPressed:(id)sender {

  //通过push跳到另一个界面;
  First02ViewController *first02 = [[First02ViewController alloc] init];
  [self.navigationController pushViewController:first02 animated:true];

}

@end

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

#import "First02ViewController.h"

@interface First02ViewController ()

@end

@implementation First02ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  self.title = @"新闻";

}

- (IBAction)backButtonPressed:(id)sender {

  //通过pop返回到push过来的界面;
  [self.navigationController popViewControllerAnimated:true];
}

@end

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

#import "SecondViewController.h"
#import "Second02ViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  self.title = @"2222";

}

- (IBAction)buttonPressed:(id)sender {

  //通过modal方式跳转,跳过去后的界面没有导航栏;
  Second02ViewController *second02 = [[Second02ViewController alloc] init];
  [self presentViewController:second02 animated:true completion:nil];

}

@end

然后通过dismiss返回。

#import "Second02ViewController.h"

@interface Second02ViewController ()

@end

@implementation Second02ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

}

- (IBAction)backButtonPressed:(id)sender {

  //通过dismiss返回modal过来的界面;
  [self dismissViewControllerAnimated:true completion:nil];

}

@end

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

github主页:https://github.com/chenyufeng1991  。欢迎大家访问!

最近极客学院Wiki正在进行IT职业技能图谱的制定,我主要负责iOS方向,大家感兴趣的可以一起参加,有问题或者修改可以直接给我发issues或者pull request。https://github.com/chenyufeng1991/skillmap  。

时间: 2024-12-10 15:39:55

iOS开发——代码生成TabBar与视图切换详解的相关文章

iOS开发——代码生成TabBar与视图切换具体解释

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

iOS开发——实用篇&amp;KVO与KVC详解

KVO与KVC详解 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听(KVO)特性: 键值编码KVC 键值监听KVO 键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方便,因为你可以利用字符串的方式去动态控制一个对象.其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的动态读写,这种方式就是Key Valu

iOS开发中的UDID和UUID详解

今天突然想和大家聊聊UDID和UUID的问题,虽然平时我们对这两个东西很忽视,往往也很难区分这两个东西.今天就来好好谈谈. [UDID] UDID的全名为 Unique Device Identifier :设备唯一标识符.从名称上也可以看出,UDID这个东西是和设备有关的,而且是只和设备有关的,有点类似于MAC地址.我在上一篇博客中<iOS应用发布流程详解>提到了真机调试,然后需要把UDID这个东西添加到Provisoning Profile授权文件中,也就是把设备唯一标识符添加进去,以此来

iOS开发——控制器OC篇&amp;UINavigationController&amp;UITabBarController详解

UINavigationController&UITabBarController详解 一:UINavigationController 控制器的属性: UINavigationController以栈的形式保存子控制器 @property(nonatomic,copy) NSArray *viewControllers; @property(nonatomic,readonly) NSArray *childViewControllers; 导航控制器之间的跳转: 使用push方法能将某个控制

iOS开发——UI篇OC篇&amp;SpriteKit详解

SpriteKit详解 SpriteKit,iOS/Mac游戏制作的新纪元 这是我的WWDC2013系列笔记中的一篇,完整的笔记列表请参看这篇总览.本文仅作为个人记录使用,也欢迎在许可协议范围内转载或使用,但是还烦请保留原文链接,谢谢您的理解合作.如果您觉得本站对您能有帮助,您可以使用RSS或邮件方式订阅本站,这样您将能在第一时间获取本站信息. 本文涉及到的WWDC2013 Session有 Session 502 Introduction to Sprite Kit Session 503 D

iOS开发——UI篇OC篇&amp;UICollectionView详解+实例

UICollectionView详解+实例 实现步骤: 一.新建两个类 1.继承自UIScrollView的子类,比如HMWaterflowView * 瀑布流显示控件,用来显示所有的瀑布流数据 2.继承自UIView的子类,比如HMWaterflowViewCell * 代表着瀑布流数据中的一个单元(一个格子) 3.总结 HMWaterflowView和HMWaterflowViewCell的关系实际上类似于 UITableView和UITableViewCell的关系 二.设计HMWater

iOS开发——UI篇OC篇&amp;UIStackView详解

UIStackView详解 一.继承关系.遵守协议.隶属框架及可用平台 UIStackView 类提供了一个高效的接口用于平铺一行或一列的视图组合.Stack视图使你依靠自动布局的能力,创建用户接口使得可以动态的调整设备朝向.屏幕尺寸及任何可用范围内的变化.Stack视图管理着所有在它的 arrangedSubviews 属性中的视图的布局.这些视图根据它们在 arrangedSubviews 数组中的顺序沿着 Stack 视图的轴向排列.精确的布局变量根据 Stack 视图的 axis , d

iOS开发——网络编程Swift篇&amp;Alamofire详解

Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AFNetworking非常稳定,在Mac OSX与iOS中也能像其他Objective-C代码一样用Swift编写.不过Alamofire更适合Swift语言风格习惯(Alamofire与AFNetworking可以共存一个项目中,互不影响). Alamofire 取名来源于Alamo Fire fl

iOS开发——UI篇OC篇&amp;UIDynamic详解

iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如:重力.弹性碰撞等现象 2.物理引擎的价值 广泛用于游戏开发,经典成功案例是“愤怒的小鸟” 让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果 提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏 3.知名的2D物理引擎 Box2d Chipmunk 二.使用