首页 > 其他分享 >iOS开发系列课程(07) --- 分栏视图控制器

iOS开发系列课程(07) --- 分栏视图控制器

时间:2023-06-20 14:35:27浏览次数:36  
标签:控制器 07 iOS alloc 视图 NSUserDefaults UITabBarController 分栏


UITabBarController的使用

  UITabBarController是如下所示的视图控制器,有人叫它分栏视图控制器,也有人叫它选项卡控制器或页签视图控制器(通常我不称它为标签视图控制器主要是为了避免和UILabel标签混淆),它是在很多App种都能见到的一种视图控制器,如下图所示。

iOS开发系列课程(07) --- 分栏视图控制器_偏好设置

iOS开发系列课程(07) --- 分栏视图控制器_视图控制器_02

  使用UITabBarController的场景很多,下图所示的微信和喜马拉雅听书都使用分栏视图控制器。

iOS开发系列课程(07) --- 分栏视图控制器_ios开发_03


iOS开发系列课程(07) --- 分栏视图控制器_bundle_04

创建UITabBarController

// 创建分栏控制器
    UITabBarController * tbc = [[UITabBarController alloc] init];
    // 添加分栏控制器管理的视图控制器
    tbc.viewControllers = @[视图控制器1, 视图控制器2, ... ];
    // 将UITabBarController对象作为根视图控制器
    self.window.rootViewController = tbc;

  下图展示了UITabBarController的构成。

iOS开发系列课程(07) --- 分栏视图控制器_视图控制器_05

  和UINavigationController非常类似,UITabBarController也包含一个UITabBar(选项卡栏),上面有若个个UITabBarItem(选项卡项),每个选项卡项又由标题、图片和徽章构成。

将UINavigationController加入到UITabBarController中

  UINavigationController和UITabBarController混合使用在App开发中还是很常见的,大致有两种使用模式:

  1. UITabBarController各子界面是独立的导航关系,互不影响
UIViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@”FirstViewController” bundle:nil];
    UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@”SecondViewController” bundle:nil];
    UINavigationController* nav1 = [[UINavigationController alloc] initWithRootViewController:viewController1];
    UINavigationController* nav2 = [[UINavigationController alloc] initWithRootViewController:viewController2];
    UITabBarController* tabBarController = [[UITabBarController alloc] init];
    tabBarController.viewControllers = [NSArray arrayWithObjects:nav1, nav2, nil];
    self.window.rootViewController = tabBarController;
  1. 应用整体是一个导航关系,只在根界面上分若干选项卡页
UIViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@”FirstViewController” bundle:nil];
    UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@”SecondViewController” bundle:nil];
    UITabBarController* tabBarController = [[UITabBarController alloc] init];
    tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
    UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:tabBarController];
    self.window.rootViewController = navController;

多于4个分栏的处理

  通常情况下分栏条最多支持5个视图控制器,如果超过5个,只显示4个,第5项变成了一个More,点击后会出现一个UITableViewController用于放置多余的视图控制器,通过导航可以切换,也可以对其进行编辑,如下图所示。

iOS开发系列课程(07) --- 分栏视图控制器_ios开发_06

iOS开发系列课程(07) --- 分栏视图控制器_ios开发_07

iOS开发系列课程(07) --- 分栏视图控制器_偏好设置_08

显示上次选中的视图

  如果我们希望在下次打开App的时候能够恢复到上次选中的视图(这应该是一个非常好的用户体验),那么我们可以使用NSUserDefaults来记录用户最后选中了第几个分栏。记录用户的喜好和习惯是构造一个优秀应用的基础,这能让用户感觉到在使用我们的App时更加得心应手,很多应用都有用户偏好设置,我们如何存储这些偏好设置呢?每个应用包种都有一个info.plist文件,它是一个键值对映射,可以方便的存储用户偏好,可以通过NSUserDefaults来访问plist文件。

  NSUserDefaults提供了 standardUserDefaults 类方法来获得NSUserDefaults对象,接下来就是键值对映射的读写操作,使用起来非常的简单。

// 实现UITabBarControllerDelegate协议中的方法在选中某个视图控制器时回调
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    NSUserDefaults *userDef = [NSUserDefaults standardUserDefaults];
    // 将用户选中的视图控制器的索引通过NSUserDefaults对象存储起来
    [userDef setInteger:tabBarController.selectedIndex forKey:@"selectedTabIndex"];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // ... ...

    NSUserDefaults *userDef = [NSUserDefaults standardUserDefaults];
    // 将UITabBarController对象选中的索引设置为plist存储的选中索引
    tbc.selectedIndex = [userDef integerForKey:@"selectedTabIndex"];

    // ... ...
}

  通过NSUserDefaults对象可以完成下列操作:
- 注册出厂设置:使用 registerDefaults:方法,这个方法的参数是一个NSDictionary的对象,其中存储的是和偏好设置相关的键值对
- 读取用户偏好设置:通过 xxxForKey:系列方法可以根据键获得对应类型的值
- 修改用户偏好设置:通过 setXXX:forKey:系列方法可以设置键值对映射

说明:还可以通过为应用程序出啊构建一个叫做"settings bundle"的东西来注册并修改用户的偏好设置。

获取UITabBarController中的所有子视图控制器

   viewControllers属性可以帮助我们获得分栏视图控制器上所有的子视图控制器的数组,我们可以通过下标运算来获得某个子视图控制器。

UITabBar和UITabBarItem

  1. 图片:selectedImage属性
  2. 徽章:badgeValue属性
  3. 颜色:tintColor属性

UITabBarController的定制

  如何定制一个喜马拉雅听书那样的UITabBarController呢?我们可以继承UITabBarController并隐去自带的UITabBar,然后对整个下面的区域进行完全定制。XIB的可视化效果和关键代码如下所示:

iOS开发系列课程(07) --- 分栏视图控制器_视图控制器_09

//
//  CDMyTabBarController.m
//  day082506
//
//  Created by LUOHao on 15/8/25.
//  Copyright (c) 2015年 jackfrued. All rights reserved.
//

#import "CDMyTabBarController.h"

@interface CDMyTabBarController () {
    UIView *bottomView;
}

@end

@implementation CDMyTabBarController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 隐去原有的分栏条
    self.tabBar.hidden = YES;
    // 通过XIB加载一个视图替换原来的分栏条
    bottomView = [[[NSBundle mainBundle] loadNibNamed:@"CDMyTabBarView" owner:self options:nil] firstObject];

    CGRect rect = self.view.bounds;
    bottomView.frame = CGRectMake(0, rect.size.height - 92, rect.size.width, 92);

    [self.view addSubview:bottomView];

    for (UIView *tempView in bottomView.subviews) {
        if ([tempView isKindOfClass:[UIButton class]]) {
            UIButton *tempButton = (id)tempView;
            [tempButton addTarget:self action:@selector(tabBarButtonItemClicked:) forControlEvents:UIControlEventTouchUpInside];
        }
    }
}

- (void)tabBarButtonItemClicked:(UIButton *)sender {
    // 根据按钮的tag值确定选中的分栏的索引
    self.selectedIndex = sender.tag - 200;

    // 将所有按钮的设置为未选中状态
    for (UIView *tempView in bottomView.subviews) {
        if ([tempView isKindOfClass:[UIButton class]]) {
            UIButton *tempButton = (id)tempView;
            tempButton.selected = NO;
        }
    }

    // 将点击的按钮设置为选中状态
    sender.selected = YES;
}
@end


标签:控制器,07,iOS,alloc,视图,NSUserDefaults,UITabBarController,分栏
From: https://blog.51cto.com/u_16166070/6522328

相关文章

  • iOS开发系列课程(08) --- 事件处理详解和手势操作
    iOS中的事件分发事件的分类TouchEvents(多点触摸事件)touchesBegan:withEvent:方法:一个或多个手指置于视图或窗口上touchesMoved:withEvent:方法:一个或多个手指在移动touchesEnded:withEvent:方法:一个或多个手指离开视图或窗口touchesCancelled:withEvent:方法:如果其他系统事件(如内......
  • iOS开发系列课程(05) --- 导航视图控制器
    简介  导航视图控制器是一个特殊的容器视图控制器,它可以维护有明确层次关系的视图之间的切换。我们可以打开模拟器或者你的iPhone看看设置功能,这里就是一个典型的对导航视图控制器的应用,如下图所示。很明显,导航视图控制器维护了一个栈结构,这是一种先进后出(FILO)的结构,我们将一个一......
  • iOS开发系列课程(09) --- 滚动视图
    UIScrollView入门  移动设备的屏幕⼤小是极其有限的,因此直接展⽰在⽤户眼前的内容也相当有限,当展⽰的内容较多超出一个屏幕时,用户可通过滚动操作来查看屏幕以外的内容,普通的UIView不具备滚动功能,不能显⽰过多的内容。UIScrollView是一个能够滚动的视图控件,可以⽤用来展⽰大量的......
  • iOS开发笔记 - 用CocoaPods管理第三方库
    在iOS项目中使用第三方类库可以说是非常常见的事,但是要正确配置这些第三方库会非常的繁琐,还好我们有CocoaPods来做这件事情,就如同在Java的世界里有Maven和Gradle,当然Maven的作用不仅仅是第三依赖库管理。通过CocoaPods工具我们可以为项目添加被称为"Pods"的依赖库(这些类库必须是Coc......
  • iOS开发笔记 - App上架流程(视频分享)
    具体的文档可以看一下我的《iOS开发笔记-上线流程》iOS项目上线流程视频百度云盘分享下面是一些相关的官方文档:https://developer.apple.com/app-store/review/guidelines/-项目审核指南http://www.apple.com/legal/intellectual-property/guidelinesfor3rdparties.htmlhttps......
  • 6. SpringMVC的视图
    SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户SpringMVC视图的种类很多,默认有转发视图和重定向视图当工程引入jstl的依赖,转发视图会自动转换为JstlView若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图......
  • 威纶tk6070ik与台达变频器vdf-s485通讯程序 自己编写的威纶触摸屏与台达变频器的通讯
    威纶tk6070ik与台达变频器vdf-s485通讯程序自己编写的威纶触摸屏与台达变频器的通讯程序,可以直接控制变频器正反转,启动停止,监视变频器的电流电压等及错误代码等。威纶TK6070IK和台达变频器VDF-S485之间的通讯程序是由我自己编写的。通过这个程序,我能够直接控制变频器的正反转、启......
  • STM32F407 兼容FX3U PLC方案 STM32F407兼容三菱FX3U的
    STM32F407兼容FX3UPLC方案STM32F407兼容三菱FX3U的方案。STM32F407是一种微控制器,它可以与三菱FX3UPLC兼容,提供了一种解决方案。知识点和领域范围:1.微控制器:STM32F407是一种32位微控制器,它集成了处理器核心、存储器、外设和接口电路等组件,用于控制和管理各种电子设备。2.PLC......
  • FPGA电机控制源码(verilog+nios2架构)FPGA电机控制源码, 方案为单FPGA方案才用底层ver
    FPGA电机控制源码(verilog+nios2架构)FPGA电机控制源码,方案为单FPGA方案才用底层verilog+应用层nios2的软件架构,很具有学习价值。包括编码器模块算法,坐标变换算法,矢量调制算法等等。注:此代码不适合新手小白。FPGA电机控制源码是一个用于控制电机的程序代码,采用了FPGA(现场可......
  • CNC脱机源代码 USB雕刻机CNC 3联动 步进电机控制器CNC脱机源代码 STM32F407 USB雕刻机
    CNC脱机源代码USB雕刻机CNC3联动步进电机控制器CNC脱机源代码STM32F407USB雕刻机CNC3轴联动梯形加减速带插补G代码解释雕刻机插补学习代码,可以通过自己的定义改动。可以直接工业使用。CNC脱机源代码是一种用于控制USB雕刻机的程序,它可以通过控制步进电机实现CNC(Computer......