4300


コードを整理する目的でUIAlertControllerを使った独自クラスを作りたいと思っています。  
限定的な内容なので、OriginalAlertController内に要素（テキストやアクションなど）は全て突っ込んでおいて、あとは初期化するだけにできればと思っていました。

例えば利用するのViewControllerから下記のように呼び出したいです。

[code]

    let alertController = OriginalAlertController()
    presentViewController(alertController, animated: true, completion: nil)
    
[/code]

そこで下記のようなクラスを作ろうかとしましたが、「must call a designated initializer of the
superclass」のエラーが発生します。

[code]

    import UIKit
    
    class OriginalAlertController: UIAlertController{
    
        let titleStr = "タイトル"
        let messageStr = "メッセージ"
    
        override init() {
            super.init(title: self.titleStr, message: self.messageStr, preferredStyle: .Alert) // Error: Must call a designated initializer of the superclass
        }
    
        required init(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
    }
    
[/code]

調べるとconvenience initializerは呼べないということでしたが、 どのようにすれば同じような目的を達成できそうでしょうか？


CC BY-SA 3.0
2015-01-08T02:59:18.103
4261
2015-01-10T03:23:26.277
2772
question
ios objective-c swift
SwiftでUIAlertControllerの独自クラスを作りたい


以下でできました。

[code]

    import Foundation
    final class ConnectionErrorAlertController : UIAlertController{
    
      override func viewDidLoad() {
        let yesAction = UIAlertAction(title:"はい", style:.Default){
          action in NSLog("はいが押された")
        }
        addAction(yesAction)
      }
    
      class func getConnectionAlert() -> ConnectionErrorAlertController {
        return ConnectionErrorAlertController(title: "title", message: "msg", preferredStyle: .Alert)
      }
    }
    // 呼び出し方
    let instance = ConnectionErrorAlertController.getConnectionAlert()
    
[/code]


CC BY-SA 3.0
2015-01-08T03:31:58.060
4264
2015-01-08T05:51:02.027
2015-01-08T05:51:02.027
4041
4041
4261
answer


回答になっているか解りませんが、察するに以下のような方法でも良いのかなと思いました。

[code]

    class OriginalAlert {
    
        let titleStr = "タイトル"
        let messageStr = "メッセージ"
    
        var controller: UIAlertController {
            let alert = UIAlertController(title: titleStr, message: messageStr, preferredStyle: .Alert)
            alert.addTextFieldWithConfigurationHandler(nil)
            alert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
            alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
            // ...
            return alert
        }
    }
    
[/code]

呼び出し方:

[code]

    let alert = OriginalAlert()
    presentViewController(alert.controller, animated: true, completion: nil)
    
[/code]


CC BY-SA 3.0
2015-01-08T05:40:26.993
4267
2015-01-08T05:40:26.993
5605
4261
answer


その用途であれば、サブクラスを作る必要がないような気がします……。ので、関数を。

[code]

    func createConnectionAlertController() -> UIAlertController {
        let controller = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .Alert)
        controller.addAction(UIAlertAction(title:"はい", style:.Default){
            action in NSLog("はいが押された")
            })
    
        return controller
    }
    
[/code]

**[UPDATE]**

swfitらしく`extension`でも良いかもしれません。

[code]

    extension UIAlertController {
        class func connectionAlert() -> UIAlertController {
            let controller = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .Alert)
            controller.addAction(UIAlertAction(title:"はい", style:.Default){
            action in NSLog("はいが押された")
            })
            return controller
        }
    }
    
    // in UIViewController
    let controller = UIAlertController.connectionAlert()
    presentViewController(controller, animated: true, completion: nil)
    
[/code]


CC BY-SA 3.0
2015-01-08T12:57:45.803
4300
2015-01-10T03:23:26.277
2015-01-10T03:23:26.277
3154
3154
4261
answer