これが以前に尋ねられた場合、申し訳ありませんが、私は多くのことを調べましたが、多くの答えは物事が異なっていた以前の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
サブクラスに特別な初期化子を追加するにはどうすればよいですか?
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)
}
}
便利な初期化子はセカンダリであり、クラスの初期化子をサポートします。便利な初期化子を定義して、指定された初期化子のパラメータの一部をデフォルト値に設定して、便利な初期化子と同じクラスから指定された初期化子を呼び出すことができます。また、特定のユースケースまたは入力値タイプ用にそのクラスのインスタンスを作成するための便利な初期化子を定義することもできます。
それらは文書化されています こちら 。
コードで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")
}
}
たとえば、ポップオーバーにカスタム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)
}