Cách tạo Ứng dụng trống trong Xcode mà không cần Storyboard


146

Xcode6đã loại bỏ Empty Applicationmẫu khi tạo một dự án mới. Làm cách nào chúng ta có thể tạo một ứng dụng trống (không có Storyboard) trong Xcode6và trên, như trong các phiên bản trước?


3
codefromabove.com/2014/09/ từ , một hướng dẫn rất tốt cho việc này
Anurag Bhakuni


Hướng dẫn cập nhật với iOS9 và Xcode 7: Medium.com/f Frozen
Ryan Poolos

Câu trả lời:


270

Không có tùy chọn trong XCode6và phiên bản trên để trực tiếp tạo Ứng dụng trống như trong XCode5và trước đó. Nhưng chúng ta vẫn có thể tạo một ứng dụng mà không cần làm Storyboardtheo các bước sau:

  1. Tạo một Single View Application.
  2. Xóa Main.storyboardLaunchScreen.xib(chọn chúng, nhấp chuột phải và chọn xóa chúng khỏi dự án hoặc xóa chúng hoàn toàn).
  3. Xóa các mục nhập "Tên cơ sở tệp bảng phân cảnh chính" và "Khởi chạy các tên cơ sở tệp giao diện màn hình" trong Info.plisttệp.
  4. Mở AppDelegate.m và chỉnh sửa applicationDidFinishLaunchingWithOptions để nó trông như thế này:

Swift 3 trở lên:

    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
    }

Mục tiêu-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;
    }

22
Tôi thích giữ LaunchScreen.xibvà các Info.plistmục tương ứng . Không có nó, ứng dụng sẽ không chiếm toàn bộ kích thước màn hình trên những chiếc iPhone lớn hơn, điều này thật xấu xí.
tboyce12

2
Tôi thích giữ Storyboard, bản thân mình. Thật tiện lợi khi tạo nhiều thứ khác nhau, nhưng tôi cần thực hiện thiết lập ban đầu mà không cần dựa vào bảng phân cảnh.
Mazyod 4/03/2015

Có thể một lỗi trong Xcode 7 Tôi không thể xóa Main.storyboard khỏi màn hình cài đặt thông tin dự án. Tôi đã sử dụng mẫu ứng dụng trống Xcode 5 như được đề cập bởi @Silentwar Warrior.
GoodSp33d

3
Trừ khi bạn cài đặt thủ công ViewContoder gốc, câu trả lời này sẽ tạo ra lỗi thời gian chạy trong XCode7: 'NSI INTERNalInconsistencyException', lý do: 'Các cửa sổ ứng dụng dự kiến ​​sẽ có trình điều khiển xem gốc vào cuối khởi chạy ứng dụng'

11
Vui lòng thêm Mã này: self.window.rootViewControll = [[ViewContoder alloc] init]; trong AppDelegate.m của bạn theo phương thức didFinishLaunchingWithOptions. Hoặc nếu không, bạn sẽ gặp phải lỗi sau: 'Cửa sổ ứng dụng dự kiến ​​sẽ có bộ điều khiển xem gốc khi kết thúc khởi chạy ứng dụng'
Rizwan Ahmed

32

Một cách tiếp cận đơn giản sẽ được sao chép XCode 5's Empty Applicationmẫu để XCode' s mẫu thư mục.

Bạn có thể tải XCode 5's Empty Applicationmẫu từ đây , sau đó giải nén nó và sao chép vào /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Applicationthư mục.

PS phương pháp này cũng hoạt động với swift!

Chỉnh sửa
Như được đề xuất bởi @harrisg trong một bình luận bên dưới, Bạn có thể đặt mẫu được đề cập ở trên trong ~/Library/Developer/Xcode/Templates/Project Templates/iOS/Application/thư mục để có thể có sẵn ngay cả khi Xcode được cập nhật.
Và nếu không có thư mục như vậy, thì bạn có thể phải tạo cấu trúc thư mục này: Templates/Project Templates/iOS/Application/trong~/Library/Developer/Xcode/

Sử dụng phương pháp đơn giản này tôi có thể tạo ra một Empty Applicationtrong XCode 6. (Ảnh chụp màn hình đính kèm bên dưới)

Mẫu ứng dụng trống Xcode Hi vọng điêu nay co ich!


Cảm ơn. Lưu ý, bạn sẽ cần thay thế mẫu này sau khi cập nhật Xcode.
elliotrock

1
Nếu bạn đặt nó vào ~ / Thư viện / Nhà phát triển / Xcode / Mẫu / Mẫu dự án / iOS / Ứng dụng / nó sẽ không phải thay thế mỗi lần cập nhật Xcode
harrisg

@harrisg không thể tìm thấy thư mục này trong Yosemite. Bạn có thể xác nhận sự hiện diện của nó? Cảm ơn
WARLOR S1LENT 27/05/2015

1
Cách tiếp cận này hoạt động với Xcode 7.1, tuy nhiên LaunchScreen.storyboard được tạo mà một số người có thể không muốn. Tôi đã kết thúc việc sử dụng nó vì nó không can thiệp vào các chế độ xem được tạo thủ công của tôi.
bitsand

1
Nhớ giải nén tập tin vào thư mục, sao chép là không đủ.
Balaban Mario

17

Có một vài bước nữa mà bạn cần làm:

  1. Để thêm một tập tin tiền tố. (Nếu bạn cần nó)
  2. Để thêm hình ảnh khởi chạy mặc định, nếu không, kích thước ứng dụng sẽ là 320x480 trên iPhone 5.

Vì vậy, đây là một hướng dẫn đầy đủ:

  1. xóa tệp Main.storyboard
  2. xóa tệp LaunchScreen.xib
  3. xóa thuộc tính "Tên cơ sở tệp bảng phân cảnh chính" trong Info.plist
  4. xóa thuộc tính "Khởi chạy tên tệp cơ sở giao diện màn hình" trong Info.plist
  5. thêm tệp "[tên ứng dụng] -Prefix.pch" vào các tệp hỗ trợ có nội dung:

    #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. thêm "$ SRCROOT / $ PRO DỰ_NAME / [tên tệp pch]" vào cài đặt dự án -> Cài đặt bản dựng -> Apple LLVM 6.0 - Ngôn ngữ -> "Tiêu đề tiền tố"

  7. thêm "CÓ" vào cài đặt dự án -> Cài đặt bản dựng -> Apple LLVM 6.0 - Ngôn ngữ -> "Tiêu đề tiền tố tiền mã hóa"
  8. mở "Image.xcassets" và thêm LaunchImage
  9. xây dựng dự án, sau đó sẽ có cảnh báo về hình ảnh khởi chạy mặc định bị thiếu, chỉ cần nhấn vào cảnh báo và chọn để thêm mặc định, điều này sẽ thêm "Mặc định-568h @ 2x" HOẶC - Nếu bạn muốn sử dụng hình ảnh giật gân từ "Hình ảnh .xcassets ", đi đến cài đặt dự án -> MỤC TIÊU -> Chung -> trong" Nguồn hình ảnh khởi động "chọn sử dụng danh mục tài sản, nó sẽ tạo một danh mục mới, sau đó bạn có thể chọn sử dụng làm danh mục tài sản từ danh mục tài sản .
  10. thực hiện application:didFinishLaunchingWithOptions:phương pháp:

    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;

16

Câu trả lời của Akhils là hoàn toàn chính xác. Đối với những người trong chúng ta sử dụng Swift, nó sẽ như thế này:

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
}

12

Xcode 9.3.1Swift 4

  1. Trước hết bạn cần xóa Main.storyboard trong menu Project navigator .
  2. Sau đó xóa hàng Tên cơ sở tập tin bảng phân cảnh chính trong Info.plist .
  3. Và đừng quên xóa ô Giao diện chính (chỉ xóa chính ) trong Mục tiêu dự án - Chung - Thông tin triển khai .
  4. Sau đó, các bước đi đến AppDelegate.swift và trong chức năng didFinishLaunchingWithOptions viết tiếp:

    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.1Swift 5

  1. Trước hết bạn cần xóa Main.storyboard trong menu Project navigator .
  2. Sau đó xóa hàng Tên cơ sở tập tin bảng phân cảnh chính trong Info.plist .
  3. Và đừng quên xóa ô Giao diện chính (chỉ xóa chính ) trong Mục tiêu dự án - Chung - Thông tin triển khai .
  4. Bước này rất quan trọng và nó không có trong các phiên bản Xcode và Swift trước đó. Trong Info.plist, hãy truy cập: Biểu mẫu cảnh ứng dụngCấu hình cảnhVai trò phiên ứng dụngMục 0 và xóa ở đây Storyboard.name hàng.
  5. Sau đó, các bước đi đến SceneDelegate và trong cảnh chức năng viết tiếp:

    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()
    }

10

Còn một bước nữa mà bạn cần làm:

1) xóa tên cơ sở tệp bảng phân cảnh chính trong tệp 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;
}

2
có một vấn đề giới hạn, UIScreen.mainScreen (). giới hạn đang in ra: (0,0,0.0,320.0,480.0). tại sao vậy?
Esqarrouth

9

Cập nhật: Swift 5 và iOS 13:

  1. Tạo một ứng dụng xem đơn.
  2. Xóa Main.storyboard (nhấp chuột phải và xóa).
  3. Xóa "Tên bảng phân cảnh" khỏi cấu hình cảnh mặc định trong tệp Info.plist: nhập mô tả hình ảnh ở đây
  4. Mở SceneDelegate.swiftvà thay đổi func scenetừ:
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 }
}

đến

 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()
    }
}

2
Bạn cũng phải xóa "Tên cơ sở tệp bảng phân cảnh chính" khỏi Info.plist, nếu không, bạn sẽ gặp lỗi "Không thể tìm thấy bảng phân cảnh có tên 'Chính'"
Ziad Hilal

6

Tôi có mẫu Ứng dụng trống ban đầu được sử dụng trong các phiên bản Xcode trước Xcode 6. Tôi đã tải nó lên đây .

Bạn có thể tải xuống và dán nó vào thư mục mẫu Xcode theo cách thủ công hoặc cài đặt nó bằng trình quản lý gói cho Xcode, lớp Methraz . Chỉ cần tìm kiếm Ứng dụng rỗng Xcode .


5

Xóa tệp Main.storyboard

Điều này chỉ đơn giản có thể bị xóa.

Cập nhật tệp ProjectName-Info.plist

Bỏ Main storyboard base file namechìa khóa.

Tạo một tệp nib và liên kết đến trình điều khiển xem của dự án

1. Tạo tệp nib (Tệp -> Mới -> Tệp -> Xem)

2. Cập nhật File's Owner'slớp cho bất cứ điều gì mà trình điều khiển khung nhìn của dự án được gọi

3. Liên kết File's Owner's viewổ cắm với viewđối tượng trong tệp nib

Cập nhật đại biểu ứng dụng

1. Nhập tệp tiêu đề của trình điều khiển xem của dự án

2.Cập nhật :didFinishLaunchingWithOptions:phương thức ứng dụng :

- (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;
}

5

Cho Xcode 8Swift 3. Chỉ cần xóa .storyboardtệp, nó sẽ tự động xóa tham chiếu tương ứng từ bạn .plistvà trong AppDelegate.swiftmã thêm sau đây.

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

Bạn có thể viết ViewCountroll tùy chỉnh của riêng bạn và sử dụng trong đó AppDelegate.swiftnhư của bạn self.window?.rootViewController, chỉ cần thay thế UIViewControll bằng ViewContoder của riêng bạn trong đoạn mã trên.


1
Sử dụng Xcode 9.1 & Swift 4 nếu tôi chỉ đơn giản xóa tệp bảng phân cảnh mà không xóa thủ công tham chiếu tương ứng khỏi .plist Tôi gặp lỗi "Không thể tìm thấy bảng phân cảnh có tên 'Chính' trong gói". Có vẻ như tôi phải loại bỏ các tài liệu tham khảo bằng tay.
peacetype

3

Tôi đang sử dụng XCode6 Beta và tôi đã tìm kiếm một giải pháp khác cho vấn đề này bằng cách thêm mẫu rỗng từ XCode5.xx vào XCode6 Beta.

Đối với điều này, nhấp chuột phải vào XCode5.xx trong Ứng dụng, nhấp vào 'Hiển thị nội dung gói' và sao chép 'Ứng dụng trống.xctemplate' từ đường dẫn cụ thể

Nội dung / Nhà phát triển / Nền tảng / iPhoneOS.pl platform / Nhà phát triển / Thư viện / Xcode / Mẫu / Mẫu dự án / Ứng dụng

Bây giờ hãy thoát khỏi Cửa sổ và mở đường dẫn đã cho cho XCode6

Nội dung / Nhà phát triển / Nền tảng / iPhoneOS.pl platform / Nhà phát triển / Thư viện / Xcode / Mẫu / Mẫu dự án / iOS / Ứng dụng /

Dán 'Ứng dụng trống.xctemplate' trong thư mục Ứng dụng. Bây giờ khởi động lại XCode6 bằng cách thoát và tạo dự án mới. Bạn sẽ nhận được tùy chọn 'Ứng dụng trống'.

Bây giờ khi tôi đang tạo dự án rỗng mới, một tệp .pch sẽ tự động được thêm vào trong dự án (Chúng ta phải thêm thủ công trong XCode6)

Hy vọng nó sẽ làm việc


1

Có, hoặc chỉ sử dụng một trong các bản Beta trước để tạo nó và tiếp tục phiên bản mới nhất sau đó.



1

Những người khác đã giải thích làm thế nào để thoát khỏi bảng phân cảnh, vì vậy tôi sẽ bỏ qua phần này ở đây. Đây là cách tôi thích làm điều đó trong mã của mình với ít chuỗi tùy chọn hơn (được viết bằng 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
}

1

cập nhật trên Xcode 11 và ios 13. Sau khi bạn cài đặt mọi thứ nhưng vẫn thấy màn hình đen, đó là do vòng đời được xử lý bởi UISceneDelegate và khi bạn tạo một dự án mới, nó sẽ tự động tạo UISceneDelegate.m và UISceneDelegate.h. Để quay lại thời xưa trước khi chúng ta quen với UISceneDelegate. Các bước sau đây có thể giúp:

  1. xóa Manifest ứng dụng cảnh trong plist.

  2. xóa Cảnh ứng dụng Manifest.h và Cảnh ứng dụng Manifest.m

  3. xóa mã dưới dấu #pragma - Vòng đời UISceneSession trong APPdelegate.m

  4. thêm cửa sổ UIWindow * mạnh mẽ (không mạnh mẽ); trong APPdelegate.h

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.