My checklist when making a programmatic iOS app
- Pick
storyboard
when you init the iOS project (not swiftUI) - Clean up the
AppDelegate.swift
class and add a Window variable: - Delete
Main storyboard file base name
in theinfo.plist
(since xCode 11 also remove scenedelegate) - Now you can delete ViewController.swift
and
Main.storyboard (since xCode 11 also remove scenedelegate) - Add MainVC and MainView
CMD + R
Run the app, if the background is orange it works- In recent xCode apps you need to also remove main from Target -> Main interface -> Set field to blank (might require xcode clean / restart)
AppDelegate
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
lazy var window: UIWindow? = createWindow()
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
_ = window
return true
}
}
extension AppDelegate {
func createWindow() -> UIWindow {
let win = UIWindow(frame: UIScreen.main.bounds)
let vc = ViewController()
win.rootViewController = vc
win.makeKeyAndVisible() // Important since we have no Main storyboard anymore
return win
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view = View()
view.backgroundColor = .orange
}
override var prefersStatusBarHidden: Bool { return true }
}
class View: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
}
/**
* Boilerplate
*/
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Info.plist xml boilerplate:
Example of info.plist for iOS
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>