iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem

本文深入解析了iOS开发中UINavigationController的使用方法,从基本概念到实例应用,逐步指导开发者如何构建高效的导航系统。通过构建示例项目,详细介绍了如何创建和配置导航控制器,添加导航栏元素,以及响应用户操作。最后,展示了如何通过UIBarButtonItem实现导航栏交互,为用户提供流畅的用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、UINavigationController导航控制器如何使用

UINavigationController可以翻译为导航控制器,在iOS里经常用到。

我们看看它的如何使用:

下面的图显示了导航控制器的流程。最左侧是根视图,当用户点击其中的General项时 ,General视图会滑入屏幕;当用户继续点击Auto-Lock项时,Auto-Lock视图将滑入屏幕。相应地,在对象管理上,导航控制器使用了导航堆栈。根视图控制器在堆栈最底层,接下来入栈的是General视图控制器和Auto-Lock视图控制器。可以调用pushViewControllerAnimated:方法将视图控制器推入栈顶,也可以调用popViewControllerAnimated:方法将视图控制器弹出堆栈。

上图来自苹果官网。


2、UINavigationController的结构组成

看下图,UINavigationController有Navigation bar  ,Navigation View ,Navigation toobar等组成。


现在我们建立一个例子,看看如何使用UINavigationController

3、新建一个项目

命名为UINavigationControllerDemo,为了更好理解UINavigationController,我们选择Empty Application模板


4、创建一个View Controller,命名为RootViewController:依次选择File——New——New File,默认勾上With XIB for user interface.


选择正确位置创建完成,这时项目里多了三个文件,分别是RootViewController.h RootViewController.m RootViewController.xib文件。

打开RootViewController.xib,添加一个按钮控件,按钮Button改成 :Goto SecondView,为跳转做准备


5、打开AppDelegate.h,向其中添加属性:

@property (strong, nonatomic) UINavigationController *navController;

添加后AppDelegate.h文件代码如下:

#import <UIKit/UIKit.h>

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) ViewController *viewController;

@property (strong, nonatomic) UINavigationController *navController;

@end

6、在AppDelegate.m 文件的didFinishLaunchingWithOptions方法中创建添加navController,RootViewController视图。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    RootViewController *rootView = [[RootViewController alloc] init];
    rootView.title = @"Root View";
    
    self.navController = [[UINavigationController alloc] init];
    [self.navController pushViewController:rootView animated:YES];
    [self.window addSubview:self.navController.view];
    [self.window makeKeyAndVisible];
    return YES;
}
给rootView的titie命名为 Root View,好识别View直接的切换关系。用pushViewController把rootView加入到navController的视图栈中。

7、现在Root视图添加完成

看看效果:

'

现在还没有Navigation bar 。只有title。

8、添加UIBarButtonItem

bar ButtonItem分左右UIBarButtonItem。我们把左右的都添加上去。

在RootViewController.m中添加代码如下:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(selectLeftAction:)];
    self.navigationItem.leftBarButtonItem = leftButton;
    
    UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd  target:self action:@selector(selectRightAction:)];
    self.navigationItem.rightBarButtonItem = rightButton;

}

这样添加了UIBarButtonItem了,效果如下:



这里重点介绍下

UIBarButtonItem *leftButton = [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemActiontarget:selfaction:@selector(selectLeftAction:)];

UIBarButtonSystemItemAction的风格,这是系统自带的按钮风格,看下图,你不用一个个试验,你也知道想用那个item,如下图:


9、响应UIBarButtonItem的事件的实现

我们在 action:@selector(selectLeftAction:);

action添加了selectLeftAction和selectRightAction

在RootViewController.m文件中添加代码实现:

-(void)selectLeftAction:(id)sender
{
    UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"提示" message:@"你点击了导航栏左按钮" delegate:self  cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
    [alter show];
}

-(void)selectRightAction:(id)sender
{
    UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"提示" message:@"你点击了导航栏右按钮" delegate:self  cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
    [alter show];
}
这样在点击左右的UIBarButtonItem时,弹出提示:



这篇先讲添加UIBarButtonItem,下篇讲解页面跳转和添加UISegmentedControl

下篇:iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController


例子代码:https://github.com/schelling/YcDemo

著作权声明:本文由http://blog.csdn.net/totogo2010/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢

<think>好的,我现在需要给用户介绍一下全连接层。首先,我得回忆一下全连接层的基本概念,确保自己理解正确。全连接层,英文是Fully Connected Layer,有时候也叫做密集层Dense Layer)。它在神经网络中很常见,特别是在传统的多层感知机(MLP)里。 接下来,我需要确定全连接层的主要结构和作用。每个神经元都和前一层所有神经元相连,所以参数数量会很多。比如,如果前一层的输出是n个神经元,当前层有m个神经元,那么权重矩阵就是n×m,加上偏置的话,总共有n×m + m个参数。这可能带来计算量大的问题,尤其是在深层网络中。 然后,全连接层的作用是什么?主要是将前面层的特征进行组合,通过线性变换和非线性激活函数,学习复杂的模式。比如,在卷积神经网络后面接全连接层,可以把卷积层提取的局部特征整合起来,用于分类者回归任务。 不过,全连接层也有缺点。参数太多容易导致过拟合,特别是在数据量不足的情况下。可能需要使用Dropout、正则化等技术来缓解。另外,全连接层会丢失空间信息,所以在处理图像等具有空间结构的数据时,通常会先用卷积层提取特征,后面再用全连接层。 需要举例说明吗?比如在图像分类中,卷积层后面接全连接层,最后用softmax输出分类结果。者,在自然语言处理中,全连接层用于词嵌入之后的分类任务。 还要注意,现在有些网络架构开始减少全连接层的使用,比如用全局平均池化代替全连接层,以减少参数数量,防止过拟合。比如GoogLeNet和ResNet就采用了这样的结构。 用户可能想知道全连接层的数学表达式。假设输入是向量x,权重矩阵W,偏置b,激活函数是σ,那么输出就是σ(Wx + b)。这部分需要用LaTeX表示,按照用户的要求,数学公式用$...$者$$...$$格式。比如,输入x的维度是n,全连接层有m个神经元,那么W的形状就是n×m,输出是m维向量。 用户可能还想了解全连接层在反向传播中的作用,如何计算梯度。这部分可能需要详细一点的解释,但用户的问题主要是介绍,所以可能不需要太深入。不过可以提到梯度下降优化时,全连接层的参数更新依赖于链式法则。 总结一下,全连接层的介绍需要包括结构、作用、优缺点、应用场景和数学表达。结构部分要强调每个神经元连接前一层的所有神经元;作用要说明特征组合和学习复杂模式;优缺点要提到参数多、过拟合风险,以及空间信息丢失;应用场景举几个例子,比如分类任务;数学表达式用LaTeX正确书写。 需要检查是否有错误的地方,比如参数计算是否正确。假设输入是n维,输出m维,权重矩阵确实是n×m,加上m个偏置,总参数是n*m + m。没错。激活函数部分,常用的有ReLU、sigmoid、tanh等,可以提到。 另外,全连接层在不同框架中的实现可能名称不同,比如在TensorFlow中是Dense层,PyTorch中是Linear层,但作用是一样的。这点可能对用户有帮助,特别是如果他们使用这些框架的话。 最后,确保回答符合用户的要求:结构清晰,分步骤解释,使用中文,数学公式正确。避免使用Markdown格式,用自然的中文段落,适当分段,使内容易于理解。</think>全连接层Fully Connected Layer)是神经网络中的基础组件,主要用于学习输入特征之间的复杂关系。以下是分步说明: --- ### **1. 基本结构** - **全连接特性**:每个神经元与前一层的**所有神经元**相连(如图像展开为一维向量后连接)。 - **参数计算**:若输入为$n$维向量,输出为$m$维,则权重矩阵为$W \in \mathbb{R}^{n \times m}$,偏置为$b \in \mathbb{R}^m$,总参数量为$n \times m + m$。 - **数学表达**: 输出为$y = \sigma(Wx + b)$,其中$\sigma$为激活函数(如ReLU、Sigmoid)。 --- ### **2. 核心作用** - **特征组合**:通过线性变换($Wx + b$)和非线性激活函数,将输入特征映射到新空间。 - **分类/回归**:常用于网络末端,将学习到的特征转化为类别概率(如Softmax)回归值。 --- ### **3. 典型应用场景** - **图像分类**:卷积层提取局部特征后,用全连接层整合全局信息(如VGG、AlexNet)。 - **自然语言处理**:词嵌入(Word Embedding)后接全连接层进行情感分类。 - **简单示例**: 输入手写数字图像(展平为784维向量),全连接层输出10维概率(对应0-9分类)。 --- ### **4. 优缺点分析** - **优点**: - 强大的特征拟合能力,适合学习全局模式。 - 实现简单,易于与其他层(如卷积层)结合。 - **缺点**: - 参数量大,易导致**过拟合**(需配合Dropout、正则化)。 - 丢失空间信息(如将图像展平为向量)。 --- ### **5. 替代方案** 现代网络常通过以下方式减少全连接层依赖: - **全局平均池化**(Global Average Pooling):直接对特征图取均值,替代全连接层(如ResNet)。 - **1x1卷积**:在保留空间信息的同时降维(如GoogLeNet)。 --- ### **代码示例(PyTorch)** ```python import torch.nn as nn # 定义全连接层:输入维度784,输出维度10 fc_layer = nn.Linear(784, 10) # 前向传播 input = torch.randn(32, 784) # 批大小32 output = fc_layer(input) # 输出形状(32, 10) ``` 全连接层是理解深度学习的基石,但在实际应用中需权衡其计算成本与模型效果。
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值