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



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



Я хочу, чтобы подкласс UIViewController и есть пользовательский инициализатор, чтобы позволить мне легко настроить его в коде. У меня возникли проблемы с этим в Swift.



Я хочу init() функция, которую я могу использовать для передачи конкретного NSURL затем я буду использовать с контроллером вида. В моем понимании выглядит что-то вроде init(withImageURL: NSURL). Если я добавлю эту функцию, она затем попросит меня добавить

707   3  

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

    Ничего не найдено.