Как сделать пользовательский инициализатор для подкласса UIViewController в Swift?
извинения, если это было задано раньше, я искал вокруг много, и многие ответы из более ранних быстрых бета-версий, когда все было по-другому. Я не могу найти окончательного ответа.
Я хочу, чтобы подкласс UIViewController и есть пользовательский инициализатор, чтобы позволить мне легко настроить его в коде. У меня возникли проблемы с этим в Swift.
Я хочу init() функция, которую я могу использовать для передачи конкретного NSURL затем я буду использовать с контроллером вида. В моем понимании выглядит что-то вроде init(withImageURL: NSURL). Если я добавлю эту функцию, она затем попросит меня добавить
3 ответов:
class ViewController: UIViewController { var imageURL: NSURL? // this is a convenient way to create this view controller without a imageURL convenience init() { self.init(imageURL: nil) } init(imageURL: NSURL?) { self.imageURL = imageURL super.init(nibName: nil, bundle: nil) } // if this view controller is loaded from a storyboard, imageURL will be nil /* Xcode 6 required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } */ // Xcode 7 & 8 required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } }
удобство инициализаторы являются вторичными, вспомогательные инициализаторы для класс. Вы можете определить удобный инициализатор для вызова назначенного инициализатор из того же класса, что и инициализатор удобства с помощью некоторые из назначенных параметров инициализатора имеют значения по умолчанию. Можно также определить инициализатор удобства для создания экземпляра этот класс для конкретного варианта использования или типа входного значения.
они документируются здесь.
Если вам нужен пользовательский init для popover например, вы можете использовать следующий подход:
создайте пользовательский init, который использует super init с nibName и bundle, а затем получите доступ к свойству view, чтобы принудительно загрузить иерархию представлений.
затем в функции viewDidLoad можно настроить представления с параметрами, переданными при инициализации.
import UIKit struct Player { let name: String let age: Int } class VC: UIViewController { @IBOutlet weak var playerName: UILabel! let player: Player init(player: Player) { self.player = player super.init(nibName: "VC", bundle: Bundle.main) if let view = view, view.isHidden {} } override func viewDidLoad() { super.viewDidLoad() configure() } func configure() { playerName.text = player.name + "\(player.age)" } } func showPlayerVC() { let foo = Player(name: "bar", age: 666) let vc = VC(player: foo) present(vc, animated: true, completion: nil) }
Comments