web-dev-qa-db-ja.com

SwiftでUIViewControllerサブクラスのカスタム初期化子を作成するにはどうすればよいですか?

これが以前に尋ねられた場合、申し訳ありませんが、私は多くのことを調べましたが、多くの答えは物事が異なっていた以前のSwiftベータ版からのものです。私は決定的な答えを見つけることができないようです。

UIViewControllerをサブクラス化し、カスタムイニシャライザーを使用して、コードで簡単にセットアップできるようにします。 Swiftでこれを行うのに問題があります。

特定のNSURLを渡すために使用できるinit()関数が必要です。その後、View Controllerで使用します。私の考えでは、init(withImageURL: NSURL)のように見えます。その関数を追加すると、init(coder: NSCoder)関数を追加するように求められます。

これは、スーパークラスでrequiredキーワードでマークされているためだと思いますか?だから私はサブクラスでそれをしなければなりませんか?私はそれを追加します:

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

それで?私の特別な初期化子はconvenienceのものと見なされますか?指定されたもの?スーパー初期化子を呼び出しますか?同じクラスの初期化子?

UIViewControllerサブクラスに特別な初期化子を追加するにはどうすればよいですか?

73
Doug Smith
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)
    }
}
128
ylin0x81

便利な初期化子はセカンダリであり、クラスの初期化子をサポートします。便利な初期化子を定義して、指定された初期化子のパラメータの一部をデフォルト値に設定して、便利な初期化子と同じクラスから指定された初期化子を呼び出すことができます。また、特定のユースケースまたは入力値タイプ用にそのクラスのインスタンスを作成するための便利な初期化子を定義することもできます。

それらは文書化されています こちら

5
Vatsal Manot

コードでUIを作成する人向け

class Your_ViewController : UIViewController {

    let your_property : String

    init(your_property: String) {
        self.your_property = your_property
        super.init(nibName: nil, bundle: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) is not supported")
    }
}
4
Sasan Soroush

たとえば、ポップオーバーにカスタムinitが必要な場合は、次のアプローチを使用できます。

NibNameおよびbundleでsuper initを使用するカスタムinitを作成し、その後、ビュープロパティにアクセスしてビュー階層のロードを強制します。

次に、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)
}
0
rockdaswift