日期: 2021 年 10 月 12 日

正则表达式的语法规则

正则表达式的语法规则

一、行定位符(^和$)

行定位符就是用来描述字串的边界。“^”表示行的开始;“$”表示行的结尾。如:

^tm : 该表达式表示要匹配字串tm的开始位置是行头,如tm equal Tomorrow Moon就可以匹配

tm$ : 该表达式表示要匹配字串tm的位置是行尾,Tomorrow Moon equal tm匹配。

如果要匹配的字串可以出现在字符串的任意部分,那么可以直接   写成 :tm

二、单词定界符(\b、\B)

单词分界符\b,表示要查找的字串为一个完整的单词。如:\btm\b

还有一个大写的\B,意思和\b相反。它匹配的字串不能是一个完整的单词,而是其他单词或字串的一部分。如:\Btm\B

三、字符类([ ])

正则表达式是区分大小写的,如果要忽略大小写可使用方括号表达式“[]”。只要匹配的字符出现在方括号内,即可表示匹配成功。但要注意:一个方括号只能匹配一个字符。例如,要匹配的字串tm不区分大小写,那么该表达式应该写作如下格式:[Tt][Mm]

POSIX风格的预定义字符类如表所示:

%title插图%num

四、选择字符(|)

还有一种方法可以实现上面的匹配模式,就是使用选择字符(|)。该字符可以理解为“或”,如上例也可以写成 (T|t)(M|m),该表达式的意思是以字母T或t开头,后面接一个字母M或m。

使用“[]”和使用“|”的区别在于“[]”只能匹配单个字符,而“|”可以匹配任意长度的字串。如果不怕麻烦,上例还可以写为 :TM|tm|Tm|tM

 

五、连字符(-)

变量的命名规则是只能以字母和下划线开头。但这样一来,如果要使用正则表达式来匹配变量名的*个字母,要写为 :[a,b,c,d…A,B,C,D…]

这无疑是非常麻烦的,正则表达式提供了连字符“-”来解决这个问题。连字符可以表示字符的范围。如上例可以写成 :[a-zA-Z]

六、排除字符([^])

上面的例子是匹配符合命名规则的变量。现在反过来,匹配不符合命名规则的变量,正则表达式提供了“^”字符。这个元字符在前面出现过,表示行的开始。而这里将会放到方括号中,表示排除的意思。

例如:[^a-zA-Z],该表达式匹配的就是不以字母和下划线开头的变量名。

七、限定符(? * + {n,m})

对于重复出现字母或字串,可以使用限定符来实现匹配。限定符主要有6种,如表所示:

%title插图%num

八、点号字符(.)

点字符(.)可以匹配出换行符外的任意一个字符

注意:是除了换行符外的、任意的一个字符。如匹配以s开头、t结尾、中间包含一个字母的单词。

格式如下: ^s.t$,匹配的单词包括:sat、set、sit等。

再举一个实例,匹配一个单词,它的*个字母为r,第3个字母为s,*后一个字母为t。能匹配该单词的正则表达式为:^r.s.*t$

九、转义字符(\)

正则表达式中的转移字符(\)和PHP中的大同小异,都是将特殊字符(如“.”、“?”、“\”等)变为普通的字符。举一个IP地址的实例,用正则表达式匹配诸如127.0.0.1这样格式的IP地址。如果直接使用点字符,格式为:[0-9]{1,3}(.[0-9]{1,3}){3}

这显然不对,因为“.”可以匹配一个任意字符。这时,不仅是127.0.0.1这样的IP,连127101011这样的字串也会被匹配出来。所以在使用“.”时,需要使用转义字符(\)。修改后上面的正则表达式格式为: [0-9]{1,3}(\.[0-9]{1,3}){3}

十、反斜线(\)

除了可以做转义字符外,反斜线还有其他一些功能。反斜线可以将一些不可打印的字符显示出来,如表所示:

%title插图%num

还可以指定预定义字符集,如表所示:

%title插图%num

反斜线还有一种功能,就是定义断言,其中已经了解过了\b、\B,其他如表所示:

%title插图%num

十一、括号字符(())

小括号字符的*个作用就是可以改变限定符的作用范围,如“|”、“*”、“^”等。来看下面的一个表达式。

(thir|four)th,这个表达式的意思是匹配单词thirth或fourth,如果不使用小括号,那么就变成了匹配单词thir和fourth了。

小括号的第二个作用是分组,也就是子表达式。如(\.[0-9]{1,3}){3},就是对分组(\.[0-9]{1,3})进行重复操作。后面要学到的反向引用和分组有着直接的关系。

十二、反向引用

十三、模式修饰符

模式修饰符的作用是设定模式。也就是规定正则表达式应该如何解释和应用。

不同的语言都有自己的模式设置,PHP中的主要模式如表所示:

%title插图%num

IOS*个界面应用

英文字母的大小写:capitalize,uppercase,lowercase

capitalize首字母大写
uppercase全部大写
lowercase全部小写
打开Xcode,新建IOS项目
选择Single view page
点击main.storybord
在窗口右下角的标签栏,拖入text/label/button(3个)
打开辅助窗口(ViewController.h),按住ctrl选中text拖入辅助窗口(此时会出现指向辅助窗口的箭头),输 – 入名称,确定。(label与text操作相同)
按照上一步操作button,弹出框*行改为IBAction,起个名字即可
连接完成之后,界面上的操作就完成了,下面就实现点击按钮时把文本框中的英文字母转换成首字母大写、全部大写和全部小写,并输出到Label上。

文本框 textField
Label resultLabel
按钮1 capitalize
按钮2 uppercase
按钮3 lowercase
@property (weak,nonatomic) IBoutlet UITextField *textField;
@property (weak,nonatomic) IBoutlet UILabel *resultLabel;

/*
*点击3个按钮时出发的事件
*/
//首字母大写
– (IBAction) capitalize: (id)sender
{
NSString *original = _textField.text;
NSString *capitalize = [original capitalizeString];
resultLabel.text = capitalize;
}
//全部转为大写
– (IBAction) uppercase: (id)sender
{
NSString *original = _textField.text;
NSString *uppercase = [original uppercaseString];
resultLabel.text = uppercase;
}
//全部转为小写
– (IBAction) lowercase: (id)sender
{
NSString *original = _textField.text;
NSString *lowercase= [original lowercaseString];
resultLabel.text = lowercase;
}

iOS 13 Xcode11 中的 Scene Delegate

如果将Xcode更新到11, 创建项目。默认会创建SceneDelegate.swift, 那么问题来了, 这个代理用来干嘛的了?

在这篇文章中,我们将探索iOS13和Xcode11的改变。我们着重介绍scene和Delegates , 看看他们事如何影响SwiftUI,Storyboard和Xib构建的UI.

我们将学习到:

  • AppDelegate和SceneDelegate
  • 程序启动时,他们如何一起工作的
  • 怎么设置app的scene deleagate
  • 在Storyboard和SwiftUI不同环境中如何使用scene delegate

系好安全带,发车。。。

这篇文档项目环境Xcode11 和 iOS13

AppDelegate

我们对于AppDelegate非常熟悉,他是一个App启动的入口,其中的 application(_:didFinishLaunchingWithOptins: ) 方法是系统操作唤醒的*个方法。

AppDelegate 遵守UIKit框架的UIApplicationDeleaget ,但是在iOS13中app delegate发生了改变 ,我们能很快发现。

以下是iOS12 app deleget 的常规操作:

  • 设置*个ViewController,我们叫做它root View Controller吧
  • 配置app设置和启动模块,比如登录,连接服务器等
  • 注册推送通知回调,响应发送到app的推送通知
  • 响应app生命周期事件,比如进入后台,唤醒和退出应用

使用Storyboard启动的app, app delegate都是千篇一律的。因为它只返回true 就像下面这个方法:

  1. func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
  2. {
  3. return true
  4. }

一个简单的使用Xib的app, 需要设置自己的根控制器,就像这样:

  1. func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
  2. {
  3. let timeline = TimelineViewController()
  4. let navigation = UINavigationController(rootViewController: timeline)
  5. let frame = UIScreen.main.bounds
  6. window = UIWindow(frame: frame)
  7. window!.rootViewController = navigation
  8. window!.makeKeyAndVisible()
  9. return true
  10. }

在上面的代码中,我们创建了一个控制器, 并且把他放在导航栏控制器中,把他分配为给 UIWindow对象的rootController属性。 这个window对象是 app delegate的属性, 是我们app拥有的一个window.

app的window是iOS中一个非常重要的概念, 一般一个window就是一个app,而且大部分iOS 应用只有一个window, 它就是你应用 UI界面的可视, 用户点击事件, 提供后台显示内容。 当然这里的window和微软的Windows不是一个东西, 是不同的概念(谢谢你 Xerox!)。

好现在我们把重点放在scene delegate。

SceneDelegate

在iOS 13及以上 scene delegate 将扮演 一些 app delegate 的作用, 大多数情况窗口(window)的概念被场景(scene)替换。 一个应用可以有多个场景, 而场景又是作为应用的界面和内容的呈放。

一个app有多个场景的概念来说是特别地, 而且这样就允许您创建多窗口的iOS或者iPadOS应用。在一个 文本处理app中,每一个文档都可以有自己的场景。例如, 用户可以创建一个场景的复制场景, 一次可以运行一个app的多实例。

在Xcode 11中跳转使用scene delegate有三个地方:

  1. 新建一个项目,会自动创建SceneDelegate 类, 它包括 生命周期事件,比如 动作, 注册, 连接等
  2. AppDelegate中有两个关联scene sessions的方法,叫做 application(_:configurationForConnecting: options:) 和 application(_: didDiscardSceneSessions:)
  3. 在 Info.plist文件中的属性列表中有一个Application Scene Manifests(应用场景清单)属性(如下图),可以进行相应配置, 比如类、代理、 storyboard名字等

%title插图%num

好,让我们一步一步操作。

1. 场景代理类(Scene Delegate Class)

SceneDelegate类如:

  1. import UIKit
  2. class SceneDelegate: UIResponder, UIWindowSceneDelegate {
  3. var window: UIWindow?
  4. func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
  5. // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
  6. // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
  7. // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
  8. guard let _ = (scene as? UIWindowScene) else { return }
  9. }
  10. func sceneDidDisconnect(_ scene: UIScene) {
  11. // Called as the scene is being released by the system.
  12. // This occurs shortly after the scene enters the background, or when its session is discarded.
  13. // Release any resources associated with this scene that can be re-created the next time the scene connects.
  14. // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
  15. }
  16. func sceneDidBecomeActive(_ scene: UIScene) {
  17. // Called when the scene has moved from an inactive state to an active state.
  18. // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
  19. }
  20. func sceneWillResignActive(_ scene: UIScene) {
  21. // Called when the scene will move from an active state to an inactive state.
  22. // This may occur due to temporary interruptions (ex. an incoming phone call).
  23. }
  24. func sceneWillEnterForeground(_ scene: UIScene) {
  25. // Called as the scene transitions from the background to the foreground.
  26. // Use this method to undo the changes made on entering the background.
  27. }
  28. func sceneDidEnterBackground(_ scene: UIScene) {
  29. // Called as the scene transitions from the foreground to the background.
  30. // Use this method to save data, release shared resources, and store enough scene-specific state information
  31. // to restore the scene back to its current state.
  32. }
  33. }

场景代理中*重要的方法是 scene(_:willConnectTo:options:), 一般来说它等同于iOS 13之前的 application(_: didFinishLaunchingWithOptions:)方法, 场景被添加到app,这个方法将被调用, 这是配置场景完美的地方。 在上面的代码中, 我们可以设置controller栈,这个设置我们等会儿再说

重点注意SceneDelegate在使用delegate时,当然 一个delegate 也可以响应任何场景,如果你想使用一个代理配置所有场景的话。

SceneDelegate也包含下面这些方法:

  • sceneDidDisConnect(_:) 场景没有连接时调用(等一会儿他会再连接)
  • sceneDidBecomeActive(_:) 当用户开始进入场景时调用,比如从app switcher(应用切换)选中app
  • scenewillResignActive(_:) 当用户停止进入场景,比如进入另一个场景
  • sceneWillEnterForeground(_:) 当用户将要进入前台,比如从后台开始或者唤醒
  • sceneDidEnterBackground(_:) 当场景将要进入后台,比如 app *小化,但是依然在后台运行

 

2. 应用代理:场景会话(AppDelegate : Scene Sessions)

在iOS13中, Appdelegate类现在包含了与secene sessions 相关的方法。 创建一个场景的同是 场景对象也会随之创建,场景会话对象跟踪管理场景的相关信息, 方法如下:

  • application(_: configurationForConnecting: optings:) 这个是返回场景配置对象的。
  • application(_:didDiscardSceneSessions:) 你的app用户关闭一个或者多个场景时调用。

现在, 场景会话用于指定一个场景, 比如 “External Display” 或者 “CardPlay”, 也被用来存储一个场景的状态, 用于状态恢复非常好用。 状态恢复允许你恢复或者再次创建UI在app启动期间。你也可以分配用户信息到场景会话中, 这是一个你可以放入任何能放入的字典。

application(_:didDiscardSceneSession:) 是非常简单的, 当用户通过应用切换来关闭一个或者多个场景时会调用。你可以在这里释放一些你场景使用的资源,因为他们不在需要使用了。

对比与 sceneDidDisconnect(_:) , 这个方法标识当场景仅仅失去连接,但是不一定丢弃。 它可能会尝试重连, 直到application(_:didDiscardSceneSession:) 使用应用切换标记场景退出。

3.Info.plist中的应用场景清单(Application Scene Manifest)

你使用的每一个场景都需要在应用场景清单中声明过, 简而言之就是清单列出你应用支持的场景。 大多是app只有一个场景,但是你能创建更多个,比如响应通知或者事件的单独场景。

应用场景清单也是Info.plist文件中的一部分,Info.plist也是一个明确知道应用配置的好地方。该文件属性列表包含应用名字,版本号,支持设备方向等

注意在这里声明session的类型, 而不是session本身。 你的app能支持一个场景, 创建一个场景的副本和使用它来创建多窗口app.

以下是Info.plist的列表大概:

%title插图%num

在顶层,你可以看见应用场景清单子项,下面时Enable Multiple Windows ,如果你需要支持多窗口,需要设置为YES. 再往下是一个声明应用内场景的Applicaiton Session Role数组。 另一个部分能用于声明外部场景。

*重要的信息是Application Session Role 数组部分, 包括:

  • Configeration Name 配置的名字,必备的
  • 场景的类名, UIWindowScene
  • Delegate Class Name 场景代理类名,一般是SceneDelegate
  • 场景初始化storyboard的名字

storyboard的名字部分主要提醒用户主Storyboard,以便于在Xcode 12 的项目属性配置中看到。 一般基本iOS 应用中, 如果你不使用场景这就是你设置或改变主要Storyboard的地方【译者发现,如果需要改变主显示Storyboard,只能在这里修改,直接在项目的General -> Deployment Info -> Main Interface中修改是没有效果的。 】。

如何用SceneDelegate、 AppDelegate中的scene session 应用场景清单怎么创建多窗口app?

  • 首先,我们已经了解过Scenedelegate类, 它管理场景的声明周期,响应事件(比如sceneDidBecomeActive(_:)和 sceneDidEnterBackground(_:))
  • 之后,我们检查Appdelegate的新方法,它管理场景会话,提供场景配置数据, 用户丢弃场景响应
  • *后,我们查看应用场景清单(Application Scene Manifest),它罗列出你应用支持的场景, 代理类和初始化storyboard

太棒了!有了初步了解,我们看看用Xcode11创建UI,看看是如何影响的。

基于SwiftUI的Scene Delegate

iOS13*简单创建项目方法是使用SwiftUI, 简单来说  SwfitUI创建的项目大多是都是通过SceneDelegate设置初始化UI的

首先看看SwiftUI的应用场景清单长什么样子:

%title插图%num

这是非常标准的,对于默认app,哪里标准了? 使用Default Configuration标识不包含的Storyboard Name Set 。记住, 如果你想支持多窗口,需要吧Enable Multiple Windows 设置为 YES.

我们跳过AppDelegate, 因为它非常标准,只返回true.

下一步, 看看 SceneDelegate类, 在我们修改之前,场景代理设置了你应用的场景响应。和设置她们的初始化视图。

就像这样:

  1. class SceneDelegate: UIResponder, UIWindowSceneDelegate {
  2. var window: UIWindow?
  3. func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
  4. let contentView = ContentView()
  5. if let windowScene = scene as? UIWindowScene {
  6. let window = UIWindow(windowScene: windowScene)
  7. window.rootViewController = UIHostingController(rootView: contentView)
  8. self.window = window
  9. window.makeKeyAndVisible()
  10. }
  11. }

上面的代码做了什么了?

首先,认真考虑scene(_:willConnetectTo:options:)协议方法(当一个新场景加入),提供scene对象和session, 这个UIWindowScene对象是app创建的,如此一来你就不需要手动创建。

之后,这个window属性被使用,应用仍然有UIWindow的window对象,只不过现在他们是场景的一部分。在代码中,在if let 闭包内,你可以清楚的看见使用scene参数初始化的UIWindow实例。

设置window的rootViewController属性,然后这个window变为可见(make key add visible),目的是把它放在UI层的*前面。

使用SwiftUI,你要注意,被创建的ContentView作为root view controller 通过使用UIHostingController, 这个控制器把SwiftUI基本视图放在屏幕上。

方法中有一点注意,类型为UIScene的scene参数,实际上UIWindowScene类型的实例。使用as 可选解析(到目前为止,创建的场景通常是UIWindowScene类型,但我猜想在未来,我们会看到更多类型的场景。)

所有的看起来很复杂,但是总体来看非常简单。

  • scene delegate 中配置场景,合适的时间,就是当scene(_:willConnectTo:options:) 被调用时。
  • app delegate 和Manifest ,有默认的配置,不需要引入storyboard
  • scene(_:willConnectTo:options:)方法中创建SwiftUI的视图, 放在hosting controller中,分配它为window属性的root view controller,把他们设置为UI层*前端就好了。

非常棒!让我们开始

你可以使用Xcode11创建基本项目, 选择SwfitUI, 通过选择File -> New -> Project, 之后选择 Single View App, *后选择 SwiftUI作为User Interface

 

基于Storyboard的SceneDelegate

Storyboards, XIBs, 是创建UI的有效的方式。 但是在iOS 13上是一样的。在以后,我们会看到越来越多SwiftUI 应用, 但是现在, storyboard更常用。

有趣的是,你无法多余操作,只需要选择File-> New -> Project, 选择Single View App, *后选择 Storyboard作为User Interface , 就完成了。

下面使步骤:

  • 就像之前所述,在Info.plist,你发现Main storyboard 在 Application Scene Manifest的字典中
  • 默认app delegate将使用默认的场景配置
  • 默认scene delegate  设置 UIWindow对像,使用Main.storyboard创建初始化UI

 

设置你应用的编程方式

很开发者使用代码创建UI, 随着SwiftUI的崛起, 我们能看到更多。 那如果你不是用Storyboard,而是使用xib来创建你得app UI , 来看看场景代理如何适配它吧。

首先, app delegate 和 Applicaton Scene Manifest 使完整的, 默认设置的。 我们没有使用storyboard,我们要在 SceneDelegate 的 scene(_:willConnectTo: options:)方法内设置初始化控制器。

就像这样:

  1. class SceneDelegate: UIResponder, UIWindowSceneDelegate {
  2. var window: UIWindow?
  3. func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
  4. {
  5. if let windowScene = scene as? UIWindowScene {
  6. let window = UIWindow(windowScene: windowScene)
  7. let timeline = TimelineViewController()
  8. let navigation = UINavigationController(rootViewController: timeline)
  9. window.rootViewController = navigation
  10. self.window = window
  11. window.makeKeyAndVisible()
  12. }
  13. }

我们来看看发生了啥:

  • 就像之前,我们持有UIWindow类型的window属性,它是用windowScene对象初始化的,该对象是由scene参数进行类型转换的
  • 在 if le闭包内, 就像上面的代码, 这就是在iOS 12及之前设置根控制器的方式在AppDelegate, 你厨师化一个view controller, 把他放在导航栏控制器里, 设置给rootViewController
  • *后,window常量分配给window属性, 然后让它可见,把他放在屏幕*前面。

很简单,对吧? *核心的是,把你之前在app delegate中代码移到scene delegate ,配置Applicaton Scene Manifest

还在找怎么为已存在的项目添加场景支持吗? 看这个吧

 

深入学习

完美了!这只是示例的一小部分, 随着我们的深入,场景代理允许你添加多窗口应用

你可能已经学会怎样为SwiftUI、Storyboard设置场景代理, 我们也看了使场景工作的三部分:app delegate , scene delegate , Application Scene Manifest , 非常棒!

IOS 使用Xcode11新建项目scenedelegate处理和Main.storyboard的处理

1.使用scenedelegate(iOS 13以下黑屏)

xcode更新到11后,新建工程里面多了好多东西,除了原有的AppDelegate外,又新加了一个SceneDelegate,是iPadOS用来做多窗口支持的,这时候如果你还像之前的一样,在APPdelegate里写self.window的方法的话,运行程序,直接崩溃了,因为新版本的xcode的APPdelegate.h里面已经没有了window这个属性,如下图所示:

%title插图%num

iOS13之前,Appdelegate会处理App生命周期和UI生命周期,但iOS 13之后,Appdelegate不在处理UI生命周期了,只负责处理 App 生命周期和新的 Scene Session 生命周期。而UI的生命周期就由Scene Delegate处理了。所以我们写self.window时就要放到scenedelegate里。如下:

%title插图%num

代码如下:

– (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions  API_AVAILABLE(ios(13.0)){

UIWindowScene *windowScene = (UIWindowScene *)scene;

self.window = [[UIWindow alloc] initWithWindowScene:windowScene];

self.window.frame = windowScene.coordinateSpace.bounds;

ViewController *control = [[ViewController alloc]init];

self.window.rootViewController = control;

[self.window makeKeyAndVisible];

}

这样就可以使用scenedelegate了。但使用了scenedelegate后,在iOS 13以下的手机运行会黑屏。如果你的程序只在iOS 13手机上运行,不适配iOS 13以下的设备,那么就到这里结束了。

2.如果要适配iOS 13以下的设备,需要把相关的scenedelegate都删掉才行。操作步骤如下:

1.删除info文件里关于scenedelegate里的配置信息:删除Application Scene Manifest,图中红色部分。

%title插图%num

2.在APPdelegate.h文件增加window属性,

%title插图%num

然后在APPdelegate.m里删除新加的scene方法。

%title插图%num

添加之前的APPdelegate生命周期的方法,如进入前台后台等等,这些方法在xcode11以下的版本里有,你可以从以前的项目复制过来。

%title插图%num

3.*后删除scenedelegate的2个文件

%title插图%num

至此,运行的项目就可以在iOS 13以下的设备运行了。同样iOS 13的设备也可以用。

3.关于main.storyboard

使用xcode新建新建项目时,都会带一个main.storyboard的主界面。如果你不进行代码控制,默认APP启动会加载main.storyboard这个界面。怎么使用这个界面来加载这里就不在介绍了,这里只说用代码加载主页,不使用main.storyboard时,怎么处理这个界面。首先和这个界面有关的主要有以下3个:*个就是main.storeboaard这个文件,如下图所示:

 

%title插图%num

 

第二个就是:General下main interface 这个选项,如下图所示:

 

%title插图%num

 

第三个就是在info表中的”Main storyboard file base name”,这个对应的vaule值是main,

 

%title插图%num

 

所以要不用main.storyboard,需要修改这三处:1.删除main.storyboard这个文件,2.将Main Interface改为空, 

 

%title插图%num

 

3.删掉info表中的”Main storyboard file base name”。

这一步在新版xcode中已经不需要了。当第二步置为空的时候,info里面已经没有Main storyboard file base name了,但是在xcode11中info文件,多了个SceneDelegate 的配置信息,如下图所示:这就需要把图中红色的部分也删掉。

%title插图%num

使用Xcode9创建*个IOS界面

1、打开Xcode选择创建一个新的工程,如下图所示:

%title插图%num

2、选择IOS->Single View App,点击Next,如下图所示:

%title插图%num

3、输入工程名以及Organization Identfier和编程所使用的语言,如下图所示:

%title插图%num

4、选择保存位置,如下图所示:

%title插图%num

5、创建之后如下图所示:

%title插图%num

6、选择storyboard类型的文件就可显示UI界面(注意要区分Main.storyboard和LanunchScreen.storyboard文件,Main主要是运行之后的界面,LanunchScreen是启动画面),就可以拖动控件了,如下图右下角所示*个按钮是新建文件的类型都有哪些,如果没有右下角的lib界面则可以选择View->Utilities->Show Object Library打开,也可以隐藏。

%title插图%num

%title插图%num

 

7、关于{}按钮应该是添加方法一类的,由于我也是*次使用,只是做一下记录,这个以后用到的时候在说明吧,如下图所示:

%title插图%num

8、第三个就是控件按钮了,比如Buttion、Label、Text等控件,可以选择这里的控件拖放到中间的空白处,如下图所示:

%title插图%num

9、左侧的View Controller Scene中的View Controller与右侧的iew Controller对应,其余的都是一一对应的,如下图所示:

%title插图%num

%title插图%num

%title插图%num

10、View指的是在运行时整个屏幕的内容,包括电量,时间等等,如下图所示:

%title插图%num

11、Safe Area是在运行时可选择的区域,也是空间可摆放的区域,如下图所示:

%title插图%num

12、下图中所示的三角是运行工程,四方框是停止运行,第三个是选择可运行的设备,比如IPhone X等设备,如下图所示:

%title插图%num

13、点击三角运行,如下图所示:

%title插图%num

14、运行成功之后就会运行出来一个手机形状的虚拟器的界面,由于没有添加任何控件所以是空白的,如下图所示:

%title插图%num

注意:如果将控件添加到此界面上在运行几秒钟控件会自动消失,那是因为此界面是启动界面而不是可操作的界面。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速