您现在的位置是:首页 >学无止境 >xib替代main.storyboard网站首页学无止境

xib替代main.storyboard

张三也爱问为什么 2024-06-04 10:27:27
简介xib替代main.storyboard

xib替代main.storyboard

其实xib和storyboard在编译时都会变成nib文件。

删除storyboard

删除main.storyboard和ViewController

创建新VC

因为上一步干脆删掉了自带的ViewController,所以这里创建一个新的VC。

创建

创建自定义VC,叫做“TestXibViewController”:

  1. File–>new–>file…–>ios–>Cocoa Touch Class。
  2. 命名TestXibViewController,记得选中Also create XIB file然后确认即可。
    此时会自动生成两个文件,都叫“TestXibViewController”,只不过一个swift,一个xib文件。

补充

  • 如果上一步没选中Also create XIB file,就不会自动关联这两个文件。
    没自动关联解决办法:
  1. 打开xib,选择左侧窗口的Placeholders的File’s Owner,点击;
  2. 右侧工具栏选中最后一个tab(连接),可以看到有一个view没有连接,
  3. 点击view后的加号,按住control,拖到屏幕上的view视图上就算建立连接了。

删除旧配置

  • IOS13之前:
    app配置的Deployment Info里找不到Main Interface去清除默认的main.storyboard。
  • IOS13之后:
    删除info.plist中的Main storyboard file base name和Application Scene Manifest下的Storyboard Name。

让新建VC可以展示

编辑window,让其指向TestXibViewController,作为展示。

  • IOS13之前:
    AppDelegate的application(didFinishLaunchingWithOptions)重载方法:
//实例化上面定义的window,参数frame描述view的位置和大小
self.window = UIWindow(frame: UIScreen.main.bounds)//UIScreen.main.bounds指的是屏幕边界
//设置UIWindow有一个根视图叫TestXibViewController
self.window?.rootViewController = TestXibViewController(nibName: "TestXibViewController", bundle: nil)
self.window?.makeKeyAndVisible()//显示app窗口
//注意:这个类应该已经定义了一个  var window: UIWindow? 前面的self.window就是指向它。
  • IOS13之后:
    SceneDelegate的scene(willConnectTo)重载方法:
if let windowScene = scene as? UIWindowScene {
    self.window = UIWindow(windowScene: windowScene)
    self.window?.rootViewController = TestXibViewController(nibName: "TestXibViewController", bundle: nil)
    self.window?.makeKeyAndVisible()
}

补充:为什么会有这个差异?

iOS13的推出,在之前AppDelegate的基础上多出了一个SceneDelegate,
会将AppDelegate里的lifecycle的那些代理方法转交给SceneDelegate。
其实就是UI的东西委托给SceneDelegate了,AppDelegate更专注app本身了。
SceneDelegate,是iPadOS用来做多窗口支持的

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。