Подтвердить что ты не робот

Как создать новый проект Swift без использования раскадровки?

Создание нового проекта в XCode 6 не позволяет отключить раскадровки. Вы можете выбрать только Swift или Objective-C и использовать или нет Core Data.

Я попытался удалить раскадровку и из проекта, удалив основную раскадровку и вручную установив окно из didFinishLaunching

В AppDelegate у меня есть это:

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow
var testNavigationController: UINavigationController

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {

        testNavigationController = UINavigationController()
        var testViewController: UIViewController = UIViewController()
        self.testNavigationController.pushViewController(testViewController, animated: false)

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

        self.window.rootViewController = testNavigationController

        self.window.backgroundColor = UIColor.whiteColor()

        self.window.makeKeyAndVisible()

        return true
    }
}

Однако XCode дает мне ошибку:

Класс 'AppDelegate' не имеет инициализаторов

Кто-нибудь преуспел в этом?

4b9b3361

Ответ 1

Вы должны пометить переменные window и testNavigationController как необязательные:

var window : UIWindow?
var testNavigationController : UINavigationController?

Классы Swift требуют инициализации необязательных свойств во время создания экземпляра:

Классы и структуры должны установить все свои сохраненные свойства в соответствующее начальное значение к моменту создания экземпляра этого класса или структуры. Сохраненные свойства не могут оставаться в неопределенном состоянии.

Свойства необязательного типа автоматически инициализируются значением nil, что указывает на то, что свойство во время инициализации намеренно предназначено для того, чтобы иметь значение "no value".

При использовании необязательных переменных не забудьте развернуть их с помощью !, например:

self.window!.backgroundColor = UIColor.whiteColor();

Ответ 2

Все, что требуется для использования раскадровки для rootViewController:

1. Измените AppDelegate.swift на:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

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

2. Создайте подкласс ViewController UIViewController:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.blue
    }
}

3. Если вы создали проект из шаблона Xcode:

  • Удалите пару ключ-значение для ключа "Main storyboard file base name" из Info.plist.
  • Удалить файл раскадровки Main.storyboard.

Как вы можете видеть в первом фрагменте кода, вместо того, чтобы неявно разворачивать необязательный, мне больше нравится синтаксис if let для развертывания необязательного свойства window. Здесь я использую его как if let a = a { }, так что необязательный a становится необязательной ссылкой внутри if -статета с тем же именем - a.

Наконец, self. не требуется при ссылке на свойство window внутри него собственного класса.

Ответ 3

Если вы хотите инициализировать свой viewController с помощью xib и использовать навигационный контроллер. Вот фрагмент кода.

var window: UIWindow?
var navController:UINavigationController?
var viewController:ViewController?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    window = UIWindow(frame: UIScreen.mainScreen().bounds)

    viewController = ViewController(nibName: "ViewController", bundle: nil);
    navController = UINavigationController(rootViewController: viewController!);

    window?.rootViewController = navController;
    window?.makeKeyAndVisible()

    return true
}

Ответ 4

Попробуйте использовать следующий код:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    self.window!.backgroundColor = UIColor.whiteColor()

    // Create a nav/vc pair using the custom ViewController class

    let nav = UINavigationController()
    let vc = NextViewController ( nibName:"NextViewController", bundle: nil)

    // Push the vc onto the nav
    nav.pushViewController(vc, animated: false)

    // Set the window’s root view controller
    self.window!.rootViewController = nav

    // Present the window
    self.window!.makeKeyAndVisible()
    return true

}

Ответ 5

Я нашел ответ, который он не имел никакого отношения к настройке xcode, удаление раскадровки и ссылка из проекта - это правильная вещь. Это связано с быстрым синтаксисом.

Код следующий:

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?
var testNavigationController: UINavigationController?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {

        self.testNavigationController = UINavigationController()
        var testViewController: UIViewController? = UIViewController()
        testViewController!.view.backgroundColor = UIColor.redColor()
        self.testNavigationController!.pushViewController(testViewController, animated: false)

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

        self.window!.rootViewController = testNavigationController

        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyAndVisible()

        return true
    }

}

Ответ 6

Вы можете просто сделать это следующим образом:

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    var IndexNavigationController: UINavigationController?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
        var IndexViewContoller : IndexViewController? = IndexViewController()
        self.IndexNavigationController = UINavigationController(rootViewController:IndexViewContoller)
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window!.rootViewController = self.IndexNavigationController
        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyAndVisible()
        return true
    }
}

Ответ 7

Я рекомендую использовать контроллер и xib

MyViewController.swift и MyViewController.xib

(Вы можете создать через File- > New- > File → Cocoa Touch Class и установить "также создать XIB файл" true, подкласс UIViewController)

class MyViewController: UIViewController {
   .....    
}

и In AppDelegate.swift func application напишите следующий код

....
var controller: MyViewController = MyViewController(nibName:"MyViewController",bundle:nil)
self.window!.rootViewController = controller
return true

Это должно быть работа!

Ответ 8

Обновлено для Swift 3.0:

window = UIWindow()
window?.rootViewController = ViewController()
window?.makeKeyAndVisible()

Ответ 9

Вот полный пример быстрой проверки для UINavigationController

        import UIKit
        @UIApplicationMain
        class KSZAppDelegate: UIResponder, UIApplicationDelegate {    
          var window: UIWindow?
          var testNavigationController: UINavigationController?

          func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
            // Override point for customization after application launch.        
            // Working WITHOUT Storyboard
            // see http://randexdev.com/2014/07/uicollectionview/
            // see http://stackoverflow.com/questions/24046898/how-do-i-create-a-new-swift-project-without-using-storyboards
            window = UIWindow(frame: UIScreen.mainScreen().bounds)
            if let win = window {
              win.opaque = true    
            //you could create the navigation controller in the applicationDidFinishLaunching: method of your application delegate.    
              var testViewController: UIViewController = UIViewController()
              testNavigationController = UINavigationController(rootViewController: testViewController)
              win.rootViewController = testNavigationController
              win.backgroundColor = UIColor.whiteColor()
              win.makeKeyAndVisible()
// see corresponding Obj-C in https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html#//apple_ref/doc/uid/TP40011313-CH2-SW1
        //      - (void)applicationDidFinishLaunching:(UIApplication *)application {
        //    UIViewController *myViewController = [[MyViewController alloc] init];
        //    navigationController = [[UINavigationController alloc]
        //                                initWithRootViewController:myViewController];
        //    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        //    window.rootViewController = navigationController;
        //    [window makeKeyAndVisible];
            //}
            }
            return true
          }
    }

Ответ 10

Почему бы вам просто не создать пустое приложение? раскадровка не создана для меня...

Ответ 11

Мы можем создавать навигационное приложение без раскадровки в Xcode 6 (iOS 8), как показано ниже:

  • Создайте пустое приложение, выбрав язык проекта как Swift.

  • Добавить новые cocoa сенсорные классы файлов с интерфейсом xib. (например. TestViewController)

  • В swift мы имеем только один файл, взаимодействующий с xib i.e. *.swift файла нет файлов .h и .m.

  • Мы можем подключить элементы управления xib с быстрым файлом, как в iOS 7.

Ниже приведены некоторые фрагменты для работы с элементами управления и Swift

//
//  TestViewController.swift
//

import UIKit

class TestViewController: UIViewController {

    @IBOutlet var testBtn : UIButton

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        // Custom initialization
    }

    @IBAction func testActionOnBtn(sender : UIButton) {
        let cancelButtonTitle = NSLocalizedString("OK", comment: "")

        let alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .Alert)

        // Create the action.
        let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .Cancel) { action in
            NSLog("The simple alert cancel action occured.")
        }

        // Add the action.
        alertController.addAction(cancelAction)

        presentViewController(alertController, animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

Изменения в файле AppDelegate.swift

//
//  AppDelegate.swift
//

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    var navigationController: UINavigationController?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyAndVisible()

        var testController: TestViewController? = TestViewController(nibName: "TestViewController", bundle: nil)
        self.navigationController = UINavigationController(rootViewController: testController)
        self.window!.rootViewController = self.navigationController

        return true
    }

    func applicationWillResignActive(application: UIApplication) {
}

    func applicationDidEnterBackground(application: UIApplication) {
    }

    func applicationWillEnterForeground(application: UIApplication) {
    }

    func applicationDidBecomeActive(application: UIApplication) {
    }

    func applicationWillTerminate(application: UIApplication) {
    }

}

Найти образец кода и другую информацию о http://ashishkakkad.wordpress.com/2014/06/16/create-a-application-in-xcode-6-ios-8-without-storyborard-in-swift-language-and-work-with-controls/