ios开发入门

2023-10-26

开发一个应用程序看起来复杂,实际上我们可以分为以下几个方面来看:

  • 设计用户界面
  • 定义交互
  • 实现行为
  • 整合数据

我们这里需要先提一种典型的软件设计典范,也就是我们常说的MVC模式。((业务模型)Model-(用户界面)View-(页面业务逻辑)Controller)

目的:将M和V实现代码分离,从而使同一个程序可以用不同的表示形式。

1. 设计用户界面

视图层次:

视图层次定义了视图相对于其他视图的布局。视图层次顶部的是窗口对象(用UIWindow类的实例表示),它作为基本的容器,将在屏幕上显示的视图对象添加到其中。

使用视图构建界面:

使用UIKit视图可以快速组装一个基本界面。其常见类型有以下几种:
在这里插入图片描述

使用串联图来布局视图:

串联图由场景组成,每个场景有关联的视图层次。通过将视图拖出对象 库并将其放在串联图场景中,可以自动将它添加到该场景的视图层次。视图在该层次中的位置由您放置 的位置决定。将视图添加到场景后,您可以在画布上对其进行大小调整、操控、配置和移动操作。

使用检查器来配置视图:

每个检查器都提供了配置界面中元素的重要选项。选择串联图中的对象(例如视图)后,可以使用各个检查器来自定义该对象的不同属性。
在这里插入图片描述

  • File:让您指定串联图的常规信息。
  • Quick Help:提供有关对象的实用文稿。 Identity。让您指定对象的自定类并定义其辅助功能属性。
  • Attributes:让您自定对象的可视化属性。
  • Size:让您指定对象的大小以及 Auto Layout 属性。
  • Connections:让您创建界面和源代码之间的连接。

PS:关于视图对象与代码的绑定我们一般使用(Ctrl+选中空间拖动到类的相应位置创建绑定)。

使用Auto Layout来定位视图:

Auto Layout 是一 种用来表示应用程序的用户界面中各种视图之间关系的体系。它可让您基于单个视图或视图组之间的约束来定义这些关系。
Auto Layout 菜单位于画布的右下角,有四个部分。您可以使用该菜单来各种类型的约束添加到画布上 的视图中,解决布局问题以及确定约束调整大小行为。

2. 定义交互

对用户界面进行布局后,接下来就需要让用户与界面进行交互。这时就要使用控制器了。控制器能响应用户操作并使用内容填充视图,从而支持您的视图。控制器对象是一个管道,通过它,视图能了解数据模型的修改,反之亦然。应用程序的控制器会通知视图有关模型数据中的修改,之后控制器会将用户发起的修改(例如,在文本栏中输入的文本)传达到模型对象。不论模型对象是响应用户操作,还是定义浏览,控制器都会实现应用程序的行为。

视图控制器

构建了基本的视图层次后,下一步就需要控制可视元素并响应用户输入。在 iOS 应用程序中,可以使用视图控制器(UIViewController)来管理内容视图及其分视图层次。
在这里插入图片描述
视图控制器并不是视图层次的一部分,也不是界面中的元素。相反,它管理着层次中的视图对象,并为它们提供行为。在串联图中构建的每个内容视图层次,都需要一个对应的视图控制器来管理界面元素, 并执行任务来响应用户的交互操作。通常,这意味着需要为每个内容视图层次编写一个自定 UIViewController子类。如果应用程序有多个内容视图,那么就需要为每个内容视图使用不同的自定视图控制器类。
视图控制器扮演着多种角色。它们负责协调应用程序的数据模型与显示该数据的视图之间的信息传输管理应用程序的内容视图的生命周期,并处理设备旋转时方向的更改。但其最主要的作用可能是响应用户输入
您还可以使用视图控制器来转换各种类型的内容。由于 iOS 应用程序显示内容的空间很有限,因此视图控制器提供了所需要的基础结构,可让您移除一个视图控制器的视图,替换为另一个视图控制器中的视图。
通过让视图控制器文件与串联图中的视图进行通信,可以定义应用程序中的交互方式。方法是通过 Action 与 Outlet 来定义串联图与源代码文件之间的连接。

操作(Action)

操作是一段代码,它与应用程序中可能会发生的某类事件相链接。该事件发生后,代码就会执行。可以定义操作来完成任何事情:从操控数据到更新用户界面。操作可驱动应用程序的流程来响应用户事件或者系统事件。
可采用如下方法来定义:使用 IBAction 返回类型和 sender 参数来创建并实现方法。

- (IBAction)restoreDefaults:(id)sender;

sender 参数指向负责触发操作的对象。IBAction 返回类型是个特殊的关键词。它与 void 关键词类似,但它表示该方法是一种操作。

Outlet:

Outlet可让您从源代码文件引用界面中的对象(添加到串联图的对象)。您可以按住 Control 键,并将串联图中的特定对象拖移至视图控制器文件来创建Outlet。这就为视图控制器文件中的对象创建了属性,通过该属性,您可以在运行时通过代码来访问并操控该对象。
Outlet 被定义为 IBOutlet 属性。

@property (weak, nonatomic) IBOutlet UITextField *textField;
控制(Control):

控制是用户界面对象(例如按钮、滑块或者开关),用户可以操控它们来与内容进行交互、提供输入、在应用程序内导航,以及执行所定义的其他操作。代码可通过控制来接收用户界面的消息。

用户与控制进行交互,会创建控制事件。控制事件表示用户可在控制上使用的各种手势,例如将手指抬离控制、手指拖移到控制上,以及在文本栏中按下。

常见的事件类型有三种:

  • 触碰和拖移事件。用户通过触碰或者拖移与控制交互时,发生的就是触碰和拖移事件。触碰事件分几个阶段。例如,当用户初次用手指触碰按钮,就会触发 Touch Down Inside 事件;如果用户手指拖离按钮,则会触发相应的拖移事件。当用户的手指抬离按钮但仍停留按钮边缘的范围内,就会发送 Touch Up Inside。如果用户在抬起手指前,手指已经拖离了按钮(实际上是取消了触碰),就会触发 Touch Up Outside 事件。
  • 编辑事件。用户编辑文本栏,发生的是编辑事件。
  • 值更改事件。用户对控制进行操控,从而导致控制产生一系列不同的值,发生的是值更改事件。
导航控制器:

如果应用程序有多个内容视图层次,就需要能够在它们之间进行切换。为此,可以使用专门的视图控制器:导航控制器 (UINavigationController)。导航控制器管理在一系列视图控制器中向后和向前切换 的操作,例如用户在 iOS 版“邮件”应用程序的电子邮件帐户、收件箱邮件和单封电子邮件之间导航。

我们将由特定导航控制器所管理的一组视图控制器称为其导航栈。导航栈是一组后进先出的自定视图控制器对象。添加到堆栈的第一个项目将变成根视图控制器,永不会从堆栈中弹出。而其他视图控制器可被压入或弹出导航栈。
虽然导航控制器的最主要作用是管理内容视图控制器的显示方式,但它还负责显示自己的自定视图。具 体来说,它会显示导航栏(位于屏幕顶部的视图,提供有关用户在导航层次中位置的上下文)。导航栏包含一个返回按钮和其他可以自定的按钮。添加到导航栈的每个视图控制器都会显示这个导航栏。

使用串联图来定义导航:

串联图是由一系列的场景组成,每个场景表示一个视图控制器及其视图层次。场景则由过渡连接。过渡表示两个视图控制器之间的切换:源视图控制器和目的视图控制器。

有以下几种过渡

  • Push:Push过渡将目的视图控制器添加到导航栈。只有当源视图控制器与导航控制器连接时,才可以使用Push过渡。

  • Modal:Modal过渡就是一个视图控制器以模态方式显示另一个控制器,需要用户在显示的控制器上执行某种操作,然后返回到应用程序的主流程。Modal视图控制器不会添加到导航栈; 相反,它通常被认为是所显示的视图控制器的子视图控制器。显示的视图控制器的作用是关闭它所 创建和显示的 Modal 视图控制器。

  • Custom:可以通过将UIStoryboardSegue子类化来定义自定过渡。

  • Unwind:Unwind过渡通过向后移动一个或多个过渡,让用户返回到视图控制器的当前实例。使用Unwind过渡可以实现反向导航。

除了过渡之外,还可以通过关系来连接场景。例如,导航控制器与其根视图控制器之间就存在关系。就此而言,这种关系表示导航控制器包含根视图控制器。

使用串联图规划应用程序的用户界面时,要确定将其中一个视图控制器标记为初始视图控制器,这一点尤为重要。运行时,该视图控制器的内容视图会在应用程序首次启动时显示,且在需要时,您可以从该视图控制器切换到其他视图控制器的内容视图。

3. 整合数据

应用程序的数据模型由数据结构和(可选)自定业务逻辑组成;自定业务逻辑是让数据保持一致状态所必要的。在设计数据模型时,不应完全忽略应用程序的用户界面。但是,您肯定会想单独实现数据模型对象,而不依赖于特定的视图或视图控制器是否存在。保持数据与用户界面分开,有助于通用应用程序 (可在 iPad 和 iPhone 双平台上运行的应用程序)的实现,也让代码复用变得更容易。

模型设计:

如果需要储存的数据很小,那么Foundation 框架类是最佳选择。例如,如果应用程序只需要跟踪字符串列表,则可以依赖 NSArray 和 NSString 来替您操作。

如果数据模型不仅要储存数据,还要求自定业务逻辑,那么可以编写一个自定类。应考虑如何将现有框架类合并到自己的类的实现中。在自定类中使用现有框架类,往往比重写更省时省力。例如,自定类可能使用NSMutableArray来储存信息,但是会定义其自己的功能来处理该信息。

4. 使用设计模式

  • MVC
  • 目标-操作
  • 委托
    • 委托是一种简单而强大的模式。在此模式中,应用程序中的一个对象代表另一个对象,或与另一个对象协调工作。授权对象保留对另一个对象(委托对象)的引用,并适时向委托对象发送信息。该信息会告诉事件的委托对象,授权对象即将处理或刚处理了某个事件。委托对象可能会对该信息作出如下响应: 更新其本身或应用程序中其他对象的外观或状态,在某些情况下,它会返回一个值来反映待处理的事件该如何处理。

    • 委托模式不仅普遍用于既有的框架类,而且也可应用在应用程序的两个自定对象之间。常见的设计是将 委托作为一种手段,允许子视图控制器将某些值(通常为用户输入的值)传达到父视图控制器。

5. 处理Foundation

值对象:
字符串(NSString):

NSString类为字符串提供了一个对象包装器,它具有诸多优势,如内置了可用于储存任意长度字符串的内存管理、提供了对各种字符编码(特别是Unicode)的支持,以及用于格式化字符串的实用工具等。 因为您通常会使用此类字符串,所以Objective-C提供了速写记法,即根据常量值来创建 NSString对象。要使用此NSString字面常量,只需在双引号字符串前面添加 (@) 符号。

// Create the string "My String" plus carriage return.
NSString *myString = @"My String\n";
// Create the formatted string "1 String".
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];
// Create an Objective-C string from a C string.
NSString *fromCString = [NSString stringWithCString:"A C string"
encoding:NSUTF8StringEncoding];
数字(NSNumber)

可以创建 NSNumber 对象,表示无符号整型 (unsigned integers)、长整型 (long integers)、长长整型 (long long integers) 和浮点值 (float values),方法是将字符“U”、“L”、“LL”和“F”分别追加到记号值末尾。例如, 创建封装浮点值的 NSNumber 对象,可以编写如下代码:

NSNumber *myFloatValue = @3.2F
集对象:
  • 数组(NSArray / NSMutableArray)
  • 集合(NSSet / NSMutableSet)
  • 字典(NSDictionary / NSMutableDictionary)
  • 使用 NSNull 表示 nil

入门demo可以阅读苹果官方已失传的详细教程:https://download.csdn.net/download/perry0528/11058022

完成demo后实现效果如下所示:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ios开发入门 的相关文章

  • iOS 应用程序测试。应用程序安装失败。找不到代码签名[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我尝试在多个 iOS 设备上安装我的应用程序 但这件事不让我这么做 我想知道 问题是什么以及我应该如何解决它 就我而言
  • React Native Detox:无法接受系统警报弹出的位置权限

    使用以下命令从命令行启动应用程序detox test configuration ios sim debug 通过代码启动应用程序await device launchApp permissions location always noti
  • 在 iOS 上构建 WebRtc

    我按照以下说明成功地在 MAC 上构建了 WebRTC http www webrtc org reference getting started http www webrtc org reference getting started
  • ios如何搜索目录

    我想知道如何检查我的应用程序中是否存在目录 例如 如果我想搜索我的应用程序文档中是否存在文件夹 以及如何在其中创建新文件夹 此致 检查文件是否存在 BOOL fileExistsAtAbsolutePath NSString filenam
  • iPhone 核心数据:无法找到 NSManagedObjectModel

    我使用 Apple 的 CoreDataBooks 示例项目作为核心数据的学习辅助工具 我修改了应用程序 以便在加载应用程序时我首先显示菜单页面 而不是图书表视图 RootViewController 我做了以下事情 我在界面生成器中创建了
  • iOS9 Sprite 套件问题

    一切都很顺利 直到我升级到 xCode 7 和 iOS 9 我当前的项目是一个 2D 平台游戏 自从升级以来 我就陷入了我们许多人似乎都面临的精灵套件错误 错误的困扰 我的问题是 每次游戏在模拟器或设备上运行时 所有精灵的 zPositio
  • 如何在 Alamofire 中使用“responseDecodable”方法?

    I have been trying to use responseDecodable method from Alamofire but I m getting Generic parameter T could not be infer
  • 如何在 iOS 中创建多行表格单元格?

    如何让第二个单元格扩展以适合文本而不是缩放文本 iOS 中有内置的方法可以做到这一点 还是我必须想出一些自制的解决方案 如果您查看 iOS 联系人应用程序 会发现有一个类似地址的框 但我找不到如何实现这一点 对于任何希望将来实现这一目标的人
  • 如何在javascript中计算日出和日落?

    我正在使用appcelerator titan开发一个IOS应用程序 我想让我的应用程序在日出和日落时向用户发送本地通知 解决这个问题的一个好工具是使用 YQL 的雅虎天气 但是 雅虎天气仅供非商业用途 我正在尝试找到一个javascrip
  • tableView:canEditRowAtIndexPath: 弹出 viewController 时崩溃

    我有一个带有UITableView 我允许通过滑动来编辑 删除 的行 就像在邮件应用程序中一样 我用以下方法来做到这一点 BOOL tableView UITableView tableView canEditRowAtIndexPath
  • 强制本地化图像或图像资产

    正如在这个问题中 如何强制 NSLocalizedString 使用特定语言 https stackoverflow com questions 1669645 how to force nslocalizedstring to use a
  • 以编程方式更改自动布局约束后视图未更新

    事先我必须说 我实际上得到了我想要的可见效果 但不是以令人满意的方式 因为现在需要 打破 约束而不是正确更新 我有一个 ViewController 其中包含一个 UITableView 那个的高度tableView可以从 0 不可见 到它
  • 使用 HTTP NSURL 创建 AVAsset

    我正在尝试合并两个NSURLs包含视频参考 其中一个 URL 指向 AWS 上的视频 另一个 URL 指向本地存储的视频 我的导出代码有效 因为我已经尝试使用两个本地视频 但每当我尝试合并 HTTP url 和本地 url 时 我都会收到此
  • 是否可以恢复我删除的 xcdatamodel 文件?

    我愚蠢地删除了它 我删除了其中包含不同版本的文件 我可以恢复到旧快照 但从那时起我就已经完成了工作 是否可以恢复到我的存档之一 或者我只能从那里提交 共享 我仍然可以运行该应用程序 但我需要对数据库进行更改 Xcode 将 xcdatamo
  • 尽早检测有问题的 XIB 视图

    我的笔尖名称有一个拼写错误 当我推向导航控制器时 它在代码中被破坏了 弄清楚它并没有花太长时间 但我认为最好尽早断言格式良好 以便更容易弄清楚 问题是它不是零 它只是无法从笔尖正确地形成自己 在 initWithNib 之后是否有更好的断言
  • XOR或其他简单的文件混淆方法ios目标c

    我正在开发一个使用受版权保护的 pdf 文件的 ios 应用程序 我正在寻找一些简单的方法来混淆文件以确保安全 这些方法不需要我经历额外的大众市场 CCATS 加密审查流程 但也将确保版权所有者已尽我所能来保证他们的数据安全 当然 我用密码
  • 在 Swift 中计算两个 CLLocation 点之间的方位角 [重复]

    这个问题在这里已经有答案了 我正在尝试计算仅 swift 代码中两个 CLLocation 点之间的方位 我遇到了一些困难 并假设这是一个非常简单的函数 堆栈溢出似乎没有列出任何内容 func d2r degrees Double gt D
  • 块如何捕获其封闭范围之外的变量?

    我知道 Objective C 块可以捕获并设置其封闭范围之外的变量值 它是如何做到的 它实际上相当简单 并在 Clang 的块实现规范中进行了描述 在 导入变量 http clang llvm org docs Block ABI App
  • 当键盘出现时调整 UITextView 的大小

    我想在键盘出现时调整文本视图的大小 我的代码如下 我打开了自动布局 因此使用来自超级视图的 textView gt bottom 空间的约束 并通过 IBOutlet distanceFromBottom 引用它 void keyboard
  • 在启动屏幕中执行代码已更新

    在原始启动屏幕中执行代码 https stackoverflow com questions 27642016 execute code in launch screen 现在默认的LaunchScreenXcode 项目中的文件已更改为

随机推荐

  • vue2项目打包dist文件后如何部署访问(本地部署和网络部署)

    1 本地部署 前提 1 注意端口的占用 防火墙的放行 2 注意后端服务的请求链接3 记得不要关闭运行4 记得element ui的引入要放在vue版本导入的后面 1 1 新建一个文件夹打开之后打开终端 1 2 npm i express s
  • 知识图谱技术概述

    1知识图谱定义与架构 1 1知识图谱定义 维基百科上对知识图谱的定义是这样的 知识图谱是谷歌及其提供的服务所使用的知识库 目的是通过从各种来源收集信息以增强其搜索结果的展示 这个定义时侠义的 知识图谱 是结构化的语义知识库 用于以符号形式描
  • 5分钟解决阿里云oss对象存储

    5分钟解决阿里云OSS对象存储 后附关键代码 启动代码如下 pom xml里添加依赖 com aliyun oss aliyun sdk oss 2 8 3 1 建类AliyunOSSClientUtil package io import
  • Centos8用户和组的管理

    1 用户和组的相关配置文件 1 1 用户的分类 linux用户三种角色 超级用户 普通用户 虚拟用户 超级用户 root 拥有对系统的最高的管理权限 UID 0 普通用户 系统用户 UID范围 1 999 Centos7 8版本 1 499
  • Python数据分析与挖掘——线性回归预测模型

    线性回归模型属于经典的统计学模型 该模型的应用场景是根据已 知的变量 自变量 来预测某个连续的数值变量 因变量 例如 餐 厅根据每天的营业数据 包括菜谱价格 就餐人数 预定人数 特价菜 折扣等 预测就餐规模或营业额 网站根据访问的历史数据
  • 超好用的开发工具-VScode插件EIDE

    EIDE介绍 一款适用于8051 STM8 Cortex M RSCv的单片机开发环境 在 vscode上提供8051 STM8 Cortex M RISC V 项目的开发编译烧录等功能 使用文档 简介 em ide com 论坛地址 Em
  • android 日期相减得天数_用 bash 倒计时日期

    需要知道重要事件发生前有多少天吗 让 Linux bash 和 date 命令可以帮助你 Sandra Henry stocker 作者 随着即将来临的重要假期 你可能需要提醒你还要准备多久 幸运的是 你可以从 date 命令获得很多帮助
  • 大量大数据如何进行查询

    1 两种查询引擎查询速度 myIsam 引擎 InnoDB 中不保存表的具体行数 也就是说 执行select count from table时 InnoDB要扫描一遍整个表来计算有多少行 MyISAM只要简单的读出保存好的行数即可 注意的
  • MySQL触发器

    MySQL触发器是用于在数据表上自动执行SQL代码的对象 触发器会在指定的数据库事件发生之前或之后触发 这些事件包括 INSERT 向表中插入数据之前或之后 UPDATE 更新表中的数据之前或之后 DELETE 从表中删除数据之前或之后 触
  • SpringBoot中logback不同环境日志配置

  • 高阶数据结构之LRU Cache

    文章目录 什么是LRU Cache LRU Cache的实现 JDK中自带的数据结构 模拟实现LRU Cache 双向链表 哈希表 什么是LRU Cache LRU的全称是 Least Recently Used 的缩写 表示最近最少的使用
  • 固态硬盘编译android源码,Mac 下的 Android 8.1源码编译(LineageOS 15.1 for XiaoMi Mix2)

    编译环境 OSX 10 12 Xcode 8 3 3 JDK 8 Android SDK 需要用到的软件 作者编译时遇到需要安装的目前就这些 不排除有用到之前自己装过的 Sed MacPorts Homebrew Imagemagick G
  • STM32以JSON格式发布HTTP请求

    在本文中 我们将学习如何将SIM800或SIM900与STM32微控制器一起使用 以及如何将JSON格式的HTTP发布请求发送到任何API服务器 介绍 除了Wifi模块或以太网模块 IoT项目也可以通过SIM800 900 GSM GPRS
  • zookeeper实现leader选举的一种方法

    写这篇文章之前 我需要解释下为什么需要实现leader选举 我们在软件系统构建过程中 总会有一个场景 就是如何保证系统高可用 保证高可用有一个简单方式就是多加几个副本 也就是部署多个节点 构成一个集群 一台机器挂掉 业务由另一台接管 在一个
  • Linux下hydra的使用

    Syntax hydra l LOGIN L FILE p PASS P FILE C FILE e nsr o FILE t TASKS M FILE T TASKS w TIME W TIME f s PORT Parameter R
  • java+date+定义+赋值,Java Script基础(五) 内置对象Date

    在JavaScript中 系统的内置对象有Date对象 Array对象 String对象和Math对象等 1 Date 用于操作日期和时间 2 Array 用于在单独的变量名中存储一系列的值 3 String 用于支持对字符串的处理 4 M
  • VS Code for Mac Hello World

    VS Code for Mac Hello World VS Code 控制台应用 打开VSCode gt Open gt 选择已经创建好的空文件夹Hello World Terminal gt New Terminal 打开控制台 dot
  • 算法之线性排序

    目录 前言 桶排序 计数排序 基数排序 问题 总结 参考资料 前言 桶排序 计数排序 基数排序这些排序算法的时间复杂度是线性的 所以我们把这类排序算法叫作线性排序 Linear sort 之所以能做到线性的时间复杂度 主要原因是 这三个算法
  • Qt 5 架构和特点

    Qt 5 模块构架 模块 功能 Qt Core Qt 5 的核心类库 每个模块都建立在Core上 Qt GUI 图形用户界面开发的最基础的类库 Qt Widgets 提供c 用户界面部件 是对Qt GUI的拓展 Qt SQL 对数据库进行操
  • ios开发入门

    开发一个应用程序看起来复杂 实际上我们可以分为以下几个方面来看 设计用户界面 定义交互 实现行为 整合数据 我们这里需要先提一种典型的软件设计典范 也就是我们常说的MVC模式 业务模型 Model 用户界面 View 页面业务逻辑 Cont