Изменение типа RootViewController в Swift

#ios #swift #rootviewcontroller

#iOS #swift #rootviewcontroller

Вопрос:

Хорошо, я следил за учебным пособием и выполнил его, все работает нормально. Однако первоначальное загружаемое представление — это UITableViewController, и я хотел бы UIViewController.

Вот код для этого:

 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
}
 

Я попытался отредактировать эту строку:

 UINavigationController(rootViewController: ViewController())
 

Для:

 window?.rootViewController = UIViewController(rootViewController: ViewController())
 

Но затем я получаю эту ошибку:

Неправильная метка аргумента в вызове (есть ‘RootViewController:’, ожидается ‘coder:’)

Затем он просит меня «Исправить это», что я и делаю, что меняет строку на:

 window?.rootViewController = UIViewController(coder: ViewController())
 

Но тогда это теперь выдает ошибку:

Не удается преобразовать значение типа ‘ViewController’ в ожидаемый тип аргумента ‘NSCoder’

Я также пробовал:

 window?.rootViewController = ViewController()
 

но при этом симулятор становится черным.

Прояснить вопрос:

Как мне получить первое представление, которое загружается в моем приложении, типа UIViewController?

Ответ №1:

Вы должны создать подкласс UIViewController и создать свою собственную версию, чтобы проверить, что она работает, но то, что вы делаете изначально, прекрасно

 let myViewController = SomeViewController()
let navigationController = UINavigationController(rootViewController: myViewController)
window?.rootViewController = navigationController
 

Затем в SomeViewController viewDidLoad set view.backgroundColor = .red

Если вы хотите удалить панель навигации, вы можете установить для нее значение hidden

 navigationController.navigationBarHidden = true
 

в качестве альтернативы…

 let myViewController = SomeViewController()
window?.rootViewController = myViewController
 

Также будет работать … хотя вы должны стремиться сохранить навигационный контроллер в целом .. обычно это значительно упрощает представление контроллеров просмотра в будущем…

Причина, по которой ваш симулятор становится черным, заключается в том, что он работал … вы показываете пустой UIViewController … Вы должны создать свой собственный UIViewController подкласс и добавить в него материал.

Ваш подкласс View Controller должен выглядеть следующим образом

 //
//  SomeViewController.swift
//  SomeProject
//
//  Created by Magoo on 17/10/2016.
//  Copyright © 2016 Magoo. All rights reserved.
//

import UIKit

class SomeViewController: UIViewController {

    override func viewDidLoad() {

        super.viewDidLoad()
        view.backgroundColor = .red

        let label = UILabel(frame:view.bounds)
        label.textColor = UIColor.whiteColor()
        label.text = "Hello world"

        view.addSubview(label)
    }
}
 

Результатом должен быть красный экран с надписью «Hello world» в центре.

Комментарии:

1. Извините, немного новый. Что вы имеете в виду: «Вы должны создать свой собственный подкласс UIViewController и добавить в него что-то». не могли бы вы объяснить? Я уже создал новый файл типа UIViewController, который имеет «класс SomeViewController: UIViewController {»

2. В XCode перейдите в меню File -> New -> File и выберите Swift File. Затем назовите его SomeViewController.swift … затем этот файл будет доступен вам в вашем проекте… и вы можете редактировать его, как хотите.

3. В основном все, что вы хотите показать на экране в этом случае, должно быть в SomeViewController отображаемом представлении.

4. Спасибо за ваше потрясающее и подробное объяснение. Очень признателен.

5. Пожалуйста. Я тоже добавил ярлык, чтобы лучше объяснить свою точку зрения