苹果于2019年10月8日发布了macOS Catalina,在此系统中,使得同时开发适合于iOS,ipadOS,macOS的应用程序APP成为可能(UWP骂骂咧咧的退出群聊),昨天,辛辛苦苦了一整天,将环境由macOS Mojve更新到了masOS Catalina,Xcode 10更新到了Xcode 11,也把ipad更新到了新的ipadOS。接下来,就开始尝试构建一个适用于三端的App运行一下,当然,有兴趣的也可以把现有的项目做些修改,打造成一个macOS的App。
环境介绍:
系统版本: macOS Catalina
Xcode版本: 11.1
iOS模拟器: 13.1
话不多说,打开Xcode直接开始像以前一样创建项目:
接下来,选择
Single View App
创建一个名为
CSApp的项目,语言选择Swift,User Interface选择Storyboard,显然SwiftUI也很有诱惑力,但是暂时不在本节的讨论范围内
创建完项目后,这里勾上
Mac
现在看下目录结构,和以前的目录结构稍有不同,除了
AppDelegate和ViewController,多出了一个SceneDelegate,这是iPadOS带来的新的多窗口支持的结果,并且有效地将应用程序委托的工作分成两部分
这里我们不再使用原本的
Main.storyboard来做UI,所以删除``Main.storyboard文件,并且在设置中移除Main 在AppDelagate```中可以看到如下代码
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
return true
}
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
}
}
在UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)我们可以看到,加载了一个名为Default Configuration的场景设置,转到Info.plist下查看,多出了一个程序的场景清单
展开后,可以看到这里配置了名为
Default Configuration的场景,默认使用了Main.storyboard,这里我们删除Storyboard Name这一项,改为使用自己的逻辑创建
删除后如图
然后,在
SceneDelegate里的func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)方法中写入以下代码
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let ws = scene as? UIWindowScene
if ws != nil{
window = UIWindow(windowScene: ws!)
window?.rootViewController = ViewController()
window?.makeKeyAndVisible()
}else{
return
}
}
在这里去设置程序的根控制器,然后,改变以下ViewController的背景颜色
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.cyan
}
}
在运行平台上选择My Mac,然后运行项目,结果如图
我们尝试以开发移动端App的逻辑代码来观察一下,首先创建一个
BViewController,并设置背景颜色为橘色
class BViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.orange
}
}
现在,各给ViewController、BViewController增加一个按钮,点击逻辑如下
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.cyan
let btn:UIButton = UIButton(frame: CGRect(x: 50, y: 50, width: 100, height: 40))
btn.setTitle("GoTo B", for: .normal)
btn.backgroundColor = UIColor.lightGray
btn.addTarget(self, action: #selector(btnClick), for: .touchUpInside)
self.view.addSubview(btn)
}
@objc func btnClick(){
let bvc:BViewController = BViewController()
bvc.modalPresentationStyle = .fullScreen
self.present(bvc, animated: true, completion: nil)
}
}
class BViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.orange
let btn:UIButton = UIButton(frame: CGRect(x: 50, y: 50, width: 100, height: 40))
btn.setTitle("GoTo A", for: .normal)
btn.backgroundColor = UIColor.lightGray
btn.addTarget(self, action: #selector(btnClick), for: .touchUpInside)
self.view.addSubview(btn)
}
@objc func btnClick(){
self.dismiss(animated: true, completion: nil)
}
}
逻辑很简单,在每个页面上增加一个按钮,ViewController点击按钮跳转到BViewController,BViewController点击按钮退出当前控制器回到ViewController,先在Mac上运行查看下结果
然后在iphone11模拟器上看下效果
ipad上就不测试了,和iphone上一样的效果。先在,就可以动手开发可以同时运行在三端设备上的原生App了,也可以稍加修改,把以前的项目迁移到Mac上了。
以上内容转载请注明出处,同时也请大家不吝你的关注和下面的赞赏
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓













网友评论