Cara membuat Aplikasi Kosong di Xcode tanpa Storyboard

146

Xcode6telah menghapus Empty Applicationtemplat saat membuat proyek baru. Bagaimana kita bisa membuat aplikasi kosong (tanpa Storyboard) di dalam Xcode6dan di atas, seperti di versi sebelumnya?

Akhil KC
sumber
3
codefromabove.com/2014/09/… , tutorial yang sangat bagus untuk ini
Anurag Bhakuni
Tutorial terkini dengan iOS9 dan Xcode 7: medium.com/frozen-fire-studios/…
Ryan Poolos

Jawaban:

270

Tidak ada opsi di dalam XCode6dan di atas versi untuk secara langsung membuat Aplikasi Kosong seperti pada XCode5dan sebelumnya. Tetapi kita masih bisa membuat aplikasi tanpa Storyboardmengikuti langkah-langkah ini:

  1. Buat a Single View Application.
  2. Hapus Main.storyboarddan LaunchScreen.xib(pilih, klik kanan, dan pilih untuk menghapusnya dari proyek, atau menghapusnya sepenuhnya).
  3. Hapus entri "Nama dasar file papan cerita utama" dan "Luncurkan nama dasar file antarmuka layar" di Info.plist file.
  4. Buka AppDelegate.m, dan edit applicationDidFinishLaunchingWithOptions sehingga terlihat seperti ini:

Swift 3 ke atas:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    {
        self.window = UIWindow(frame: UIScreen.main.bounds)
        self.window?.backgroundColor = UIColor.white
        self.window?.makeKeyAndVisible()
        return true
    }

Swift 2.x:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    {
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window?.backgroundColor = UIColor.whiteColor()
        self.window?.makeKeyAndVisible()
        return true
    }

Tujuan-C:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.window.rootViewController = [[ViewController alloc] init];
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        return YES;
    }
Akhil KC
sumber
22
Saya suka menyimpan LaunchScreen.xibdan Info.plistentri yang sesuai . Tanpa itu, aplikasi tidak akan mengambil seluruh ukuran layar pada iPhone yang lebih besar, yang jelek.
tboyce12
2
Saya suka menyimpan Storyboard, sendiri. Sangat nyaman untuk membuat berbagai hal, tetapi saya perlu melakukan pengaturan awal tanpa mengandalkan storyboard.
Mazyod
Mungkin bug di Xcode 7 saya tidak dapat menghapus Main.storyboard sama sekali dari layar pengaturan informasi proyek. Saya menggunakan template aplikasi kosong Xcode 5 seperti yang disebutkan oleh @Silentwarrior.
GoodSp33d
3
Kecuali Anda menginstal ViewController root secara manual, jawaban ini menghasilkan kesalahan runtime di XCode7: 'NSInternalInconsistencyException', alasan: 'Jendela aplikasi diharapkan memiliki pengontrol tampilan root di akhir peluncuran aplikasi'
11
Silakan tambahkan Kode ini juga: self.window.rootViewController = [[alokasi ViewController] init]; di AppDelegate.m Anda di bawah metode didFinishLaunchingWithOptions. Atau Anda akan mendapatkan kesalahan berikut: 'Aplikasi windows diharapkan memiliki pengendali tampilan root pada akhir peluncuran aplikasi'
Rizwan Ahmed
32

Pendekatan sederhana akan menyalin XCode 5's Empty Applicationtemplate untuk XCode' s template direktori.

Anda dapat men-download XCode 5's Empty Applicationtemplate dari sini , kemudian unzip dan copy ke /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Applicationdirektori.

PS pendekatan ini bekerja dengan cepat juga!

Sunting
Seperti yang disarankan oleh @harrisg dalam komentar di bawah, Anda dapat menempatkan templat yang disebutkan di atas dalam ~/Library/Developer/Xcode/Templates/Project Templates/iOS/Application/folder sehingga mungkin tersedia bahkan jika Xcode diperbarui.
Dan jika tidak ada direktori seperti itu, maka Anda mungkin harus membuat struktur direktori ini: Templates/Project Templates/iOS/Application/di~/Library/Developer/Xcode/

Dengan menggunakan pendekatan sederhana ini saya dapat membuat Empty Applicationin XCode 6. (Cuplikan layar terlampir di bawah)

Templat Aplikasi Kosong Xcode Semoga ini membantu!

WARRIOR SAHAM
sumber
Terima kasih. Sebagai catatan, Anda harus mengganti template ini setelah pembaruan Xcode.
elliotrock
1
Jika Anda memasukkannya ke ~ / Library / Developer / Xcode / Templates / Project Templates / iOS / Application / itu tidak harus diganti setiap kali pembaruan Xcode
harrisg
@harrisg tidak dapat menemukan direktori ini di Yosemite. Bisakah Anda mengkonfirmasi keberadaannya? Terima kasih
S1LENT WARRIOR
1
Pendekatan ini bekerja dengan Xcode 7.1, namun LaunchScreen.storyboard dibuat yang mungkin tidak diinginkan oleh beberapa orang. Saya akhirnya menggunakannya karena tidak mengganggu pandangan saya yang dibuat secara manual.
bitsand
1
Ingatlah untuk membuka zip file ke dalam direktori, menyalin tidak cukup.
Balaban Mario
17

Ada beberapa langkah lagi yang perlu Anda lakukan:

  1. Untuk menambahkan file awalan. (Jika kamu memerlukannya)
  2. Untuk menambahkan gambar peluncuran default, jika tidak maka ukuran aplikasi akan menjadi 320x480 pada iPhone 5.

Jadi di sini adalah tutorial lengkap:

  1. hapus file Main.storyboard
  2. hapus file LaunchScreen.xib
  3. hapus properti "Nama file utama storyboard file" di Info.plist
  4. hapus properti "Luncurkan nama file antarmuka layar antarmuka" di Info.plist
  5. tambahkan file "[nama aplikasi] -Prefix.pch" ke file pendukung dengan konten:

    #import <Availability.h>
    
    #ifndef __IPHONE_3_0
    #warning "This project uses features only available in iOS SDK 3.0 and later."
    #endif
    
    #ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #endif
  6. tambahkan "$ SRCROOT / $ PROJECT_NAME / [nama file pch]" ke pengaturan proyek -> Pengaturan Bangun -> Apple LLVM 6.0 - Bahasa -> "Prefix Header"

  7. tambahkan "YA" ke pengaturan proyek -> Pengaturan Bangun -> Apple LLVM 6.0 - Bahasa -> "Precompile Prefix Header"
  8. buka "Image.xcassets" dan tambahkan LaunchImage
  9. membangun proyek, maka akan ada peringatan tentang gambar peluncuran default yang hilang, cukup tekan pada peringatan dan pilih untuk menambahkan default, ini akan menambahkan "Default-568h @ 2x" ATAU - Jika Anda ingin menggunakan gambar splash dari "Gambar .xcassets ", buka pengaturan proyek -> TARGET -> Umum -> di" Luncurkan Gambar Sumber "pilih untuk menggunakan katalog aset, itu akan membuat yang baru, Anda dapat memilih kemudian, yang akan digunakan sebagai katalog aset dari yang sudah ada .
  10. menerapkan application:didFinishLaunchingWithOptions:metode:

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    //Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    
    return YES;
Nikita
sumber
16

Jawaban Akhils sepenuhnya benar. Bagi kita yang menggunakan Swift, akan seperti ini:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    self.window?.backgroundColor = UIColor.whiteColor()
    self.window?.makeKeyAndVisible()
    return true
}
Nils Hott
sumber
12

Xcode 9.3.1 dan Swift 4

  1. Pertama-tama Anda perlu menghapus Main.storyboard di menu Navigator proyek .
  2. Kemudian hapus baris Nama file utama storyboard di Info.plist .
  3. Dan jangan lupa hapus Antarmuka Utama sel (hapus saja Utama ) di Target Proyek Anda - Umum - Info Penyebaran .
  4. Setelah itu langkah-langkah pergi ke AppDelegate.swift dan dalam fungsi didFinishLaunchingWithOptions tulis selanjutnya:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
    
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.makeKeyAndVisible()
        window?.rootViewController = UINavigationController(rootViewController: ViewController())
    
        return true
    }

Xcode 11.2.1 dan Swift 5

  1. Pertama-tama Anda perlu menghapus Main.storyboard di menu Navigator proyek .
  2. Kemudian hapus baris Nama file utama storyboard di Info.plist .
  3. Dan jangan lupa hapus Antarmuka Utama sel (hapus saja Utama ) di Target Proyek Anda - Umum - Info Penyebaran .
  4. Langkah ini penting dan tidak ada dalam versi Xcode dan Swift sebelumnya. Dalam Info.plist pergi ke: Adegan Aplikasi Manifestadegan KonfigurasiAplikasi Sesi PeranBarang 0 dan menghapus sini Storyboard.name baris.
  5. Setelah itu langkah-langkah pergi ke SceneDelegate dan dalam adegan fungsi tulis berikutnya:

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let windowScene = (scene as? UIWindowScene) else { return }
    
        window = UIWindow(frame: windowScene.coordinateSpace.bounds)
        window?.windowScene = windowScene
        window?.rootViewController = ViewController()
        window?.makeKeyAndVisible()
    }
iAleksandr
sumber
10

Ada satu langkah lagi yang perlu Anda lakukan:

1) menghapus nama dasar file storyboard utama dalam file plist

//AppDelegate.h


@property (strong, nonatomic) UIViewController *viewController;
@property (strong, nonatomic) UINavigationController *nav;

//AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {`enter code here`
    // Override point for customization after application launch.

    CGRect screenBounds = [[UIScreen mainScreen] bounds];

    UIWindow *window = [[UIWindow alloc] initWithFrame:screenBounds];


    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];



    self.viewController = [[UIViewController alloc] initWithNibName:@"ViewController" bundle:nil];

    self.nav = [[UINavigationController alloc] initWithRootViewController:self.viewController];

    [window setRootViewController:  self.nav];

    [window makeKeyAndVisible];

    [self setWindow:window];

    return YES;
}
Bhushan_pawar
sumber
2
ada masalah bounds, UIScreen.mainScreen (). bounds sedang mencetak: (0.0.0.0.320.0.480.0). mengapa demikian?
Esqarrouth
9

Pembaruan: Swift 5 dan iOS 13:

  1. Buat Aplikasi Tampilan Tunggal.
  2. Hapus Main.storyboard (klik kanan dan hapus).
  3. Hapus "Storyboard Name" dari konfigurasi adegan default di file Info.plist: masukkan deskripsi gambar di sini
  4. Buka SceneDelegate.swiftdan ubah func scenedari:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    guard let _ = (scene as? UIWindowScene) else { return }
}

untuk

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).x

    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = ViewController()
        self.window = window
        window.makeKeyAndVisible()
    }
}
Eric Wiener
sumber
2
Anda juga harus menghapus "Nama dasar file storyboard utama" dari Info.plist, jika tidak Anda akan mendapatkan kesalahan "Tidak dapat menemukan storyboard bernama 'Main'"
Ziad Hilal
6

Saya memiliki templat Aplikasi Kosong asli yang digunakan dalam versi Xcode sebelum Xcode 6. Saya telah mengunggahnya di sini .

Anda dapat mengunduhnya dan menempelkannya di direktori template Xcode secara manual atau menginstalnya menggunakan manajer paket untuk Xcode, Alcatraz . Cukup cari Aplikasi Kosong Xcode .

Isuru
sumber
5

Hapus file Main.storyboard

Ini bisa dengan mudah dihapus.

Perbarui file ProjectName-Info.plist

Hapus Main storyboard base file namekuncinya.

Buat file nib dan tautan ke pengontrol tampilan proyek

1.Buat file nib (File -> New -> File -> View)

2. Perbarui File's Owner's kelas untuk apa pun yang disebut pengontrol tampilan proyek

3.Link File's Owner's viewoutlet ke viewobjek dalam file nib

Perbarui delegasi aplikasi

1. Impor file header pengontrol tampilan proyek

2. Perbarui :didFinishLaunchingWithOptions:metode aplikasi :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    MyViewController *viewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
    self.window.rootViewController = viewController;
    [self.window makeKeyAndVisible];
    return YES;
}
Bhargav
sumber
5

Untuk Xcode 8dan Swift 3. Hapus saja .storyboardfile itu, maka secara otomatis akan menghapus referensi yang sesuai dari Anda .plistdan di AppDelegate.swifttambahkan kode berikut.

    let initialViewController = UIViewController()
    initialViewController.view.backgroundColor = .white
    window = UIWindow(frame: UIScreen.main.bounds)
    window?.rootViewController = initialViewController
    window?.makeKeyAndVisible()

Anda dapat menulis ViewCountroller kustom Anda sendiri dan menggunakannya AppDelegate.swiftsebagai milik Anda self.window?.rootViewController, cukup ganti UIViewController dengan ViewController Anda sendiri dalam kode di atas.

Vaka
sumber
1
Menggunakan Xcode 9.1 & Swift 4 jika saya cukup menghapus file storyboard tanpa secara manual menghapus referensi yang sesuai dari .plist saya mendapatkan kesalahan "Tidak dapat menemukan storyboard bernama 'Main' dalam bundel". Sepertinya saya harus menghapus referensi secara manual.
peacetype
3

Saya menggunakan XCode6 Beta & Saya mencari solusi lain untuk masalah ini dengan menambahkan template kosong dari XCode5.xx ke XCode6 Beta.

Untuk klik kanan ini pada XCode5.xx di Aplikasi klik 'Tampilkan Konten Paket' dan salin 'Empty Application.xctemplate' dari jalur yang diberikan

Isi / Pengembang / Platform / iPhoneOS.platform / Pengembang / Perpustakaan / Xcode / Templat / Proyek Templat / Aplikasi

Sekarang keluar dari Window & buka jalur yang diberikan untuk XCode6

Isi / Pengembang / Platform / iPhoneOS.platform / Pengembang / Perpustakaan / Xcode / Templat / Proyek Templat / iOS / Aplikasi /

Tempel 'Empty Application.xctemplate' di dalam folder Aplikasi. Sekarang restart XCode6 dengan berhenti & membuat proyek baru. Anda akan mendapatkan opsi 'Aplikasi Kosong'.

Sekarang ketika saya membuat proyek Kosong baru, file .pch secara otomatis ditambahkan dalam proyek (Yang harus kita tambahkan secara manual di XCode6)

Semoga ini berhasil

Gagan_iOS
sumber
1

Ya, Atau cukup gunakan salah satu Beta sebelumnya untuk membuatnya, dan lanjutkan ke versi terbaru setelahnya.

P1kachu
sumber
1

Yang lain sudah menjelaskan bagaimana cara menghilangkan storyboard, jadi saya akan melewatkan yang itu di sini. Ini adalah bagaimana saya lebih suka melakukannya dalam kode saya dengan chaining yang kurang opsional (ditulis dalam Swift 3.1):

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    let window = UIWindow(frame: UIScreen.main.bounds)
    window.backgroundColor = .white
    window.rootViewController = MyRootViewController()
    window.makeKeyAndVisible()
    self.window = window

    return true
}
DevAndArtist
sumber
1

perbarui Xcode 11 dan ios 13. Setelah Anda mengatur semuanya tetapi masih melihat layar hitam, itu karena siklus hidup ditangani oleh UISceneDelegate dan ketika Anda membuat proyek baru, itu akan secara otomatis menghasilkan UISceneDelegate.m dan UISceneDelegate.h. Untuk kembali ke masa lalu sebelum kita terbiasa dengan UISceneDelegate. langkah-langkah berikut dapat membantu:

  1. hapus Application Scene Manifest in plist.

  2. hapus Application Scene Manifest.h dan Application Scene Manifest.m

  3. hapus kode di bawah tanda #pragma - siklus hidup UISceneSession di APPdelegate.m

  4. tambahkan @property (strong, nonatomic) UIWindow * window; di APPdelegate.h

xiaofeng zhou
sumber