2017-08-26 10 views
0

UIAlertControllerのカスタムサブクラスを作成したいと考えています。 私が正しく理解していれば、サブクラスの初期化中にsuper.init(title...をどこかに呼び出す必要があります。UIAlertControllerのサブクラスを初期化する

しかし、私は指定されたイニシャライザで問題に遭遇し続けます。私はドキュメントを読んだので、それを動作させる方法を理解できません。ここに私のコードは(コード内のコメントに注意してください)です。

class AccountInfoActionSheet: UIAlertController { 

    required init?(coder aDecoder: NSCoder) { //xcode says I need this 
     super.init(coder: aDecoder) //it also says I need to call a designated initializers so here it is 
     super.init(title: "Info", message: "Heres the Info", preferredStyle: .actionSheet) //but now I can't call this initializer 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

EDIT:UIAlertControllerは、私は単にそれが必要とされるのViewControllerの内側に正しく設定UIAlertControllerを返す関数を作成してサブクラス化することはできませんので。

答えて

1

UIAlertControllerをサブクラス化しないでください。

チェックこのリンク:

https://developer.apple.com/documentation/uikit/uialertcontroller#//apple_ref/doc/uid/TP40014538-CH1-SW2

あなたはextensionsを使用してメソッドを追加することができますが、それをサブクラス化することはできません。

+0

することができますが、あなたはいけません。 – Abizern

+0

@Abizern:そうですか?あなたはそれに関連するドキュメンテーションをどのように、どこで読むことができるか教えてください。 – Amit

+0

https://stackoverflow.com/a/45895316/41116 – Abizern

0

limon's answer to another questionと言うと、UIAlertControllerをサブクラス化することはできません。

Apple's documentationパー

UIAlertControllerクラスはそのままではなく サポートサブクラス化を行い使用することを意図しています。このクラスのビュー階層はプライベートで、 は変更しないでください。

2

一般的な警告コントローラを簡単に作成したい場合は、サブクラスを作成する代わりに、UIAlertControllerの拡張を作成して、必要な構成済みの警告コントローラの種類を返すファクトリメソッドを作成します。たとえば:

extension UIAlertController { 

    static func accountInfo() -> UIAlertController { 
     // If you want to add Alert Actions you can add them to the controller before returning them. 
     return UIAlertController(title: "Info", message: "Here's the Info", preferredStyle: .actionSheet) 
    } 
} 

そして今、あなたが単にコントローラを作成することができます

let ac = UIAlertController.accountInfo() 
0

としては、あなたがUIAlertControllerをサブクラス化することになっていない他の回答で述べました。オプションとして、あなたは、ファクトリメソッドと拡張機能を作成することができます。

extension UIAlertController { 
    static func accountInfoActionSheet() -> UIAlertController { 
     return UIAlertController(title: "Title", message: "Message", preferredStyle: .actionSheet) 
    } 
} 

しかし、他の回答は、あなたがUIAlertControllerをサブクラス化することはできませんと言って、特に真実ではありません。あなたはとは思っていない場合はとなりますが、非常にになります。

UIAlertControllerUIViewControllerのサブクラスであるため、同じ指定初期化子init(nibName: String?, bundle: Bundle?)を持っています。

init?(coder aDecoder: NSCoder)で指定したイニシャライザ自体であるため、呼び出されることはありません。たとえば、コントローラがストーリーボードから初期化されているときなどに呼び出されます。ここで

は、(Appleがそれを承認していなくても)あなたが望むものを達成する方法の例です:

class AccountInfoActionSheet: UIAlertController { 

    // preferredStyle is a read-only property, so you have to override it 
    override var preferredStyle: UIAlertControllerStyle { 
     return .actionSheet 
    } 

    init() { 
     super.init(nibName: nil, bundle: nil) 
     initialize() 
    } 

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

    // all of the configuration code that init methods might share 
    // separated into a method for the sake of convenience 
    private func initialize() { 
     title = "Info" 
     message = "Heres the Info" 
     // any other setup needed 
    } 
} 
関連する問題