2016-10-31 7 views
-1

私は自分のView ControllerにUIViewを持っています。そして、私はいくつかのラベルをプログラムで画面上に描きたい。だから私はそれをサブクラス化することができ、そのクラスではUIViewに考えました。UIviewの問題をサブクラス化する

マイコード:

import Foundation 
import UIKit 

class MainBottomView : UIView{ 

    required init?(coder aDecoder: NSCoder) { 
     super.init(frame: UIScreen.main.bounds); 

     generateLabel(CGRect(x: 5, y: 363, width: 310, height: 62),tekst: "") 
     return; 
    } 

    func generateLabel(_ fr: CGRect,tekst: String){ 

     let l = UILabel(frame: fr) 
     l.backgroundColor = UIColor(red: (21/255.0),green: (185/255.0),blue:(201/255.0),alpha:1) 
     l.textAlignment = NSTextAlignment.center 
     l.text = tekst 
     l.textColor = UIColor.white 
     l.font = UIFont(name: "HelveticaNeue", size: 23) 
     self.addSubview(l) 
    } 
} 

しかし、それは必要な初期化時にクラッシュしますか?行。なぜこれが起こっているのか分かりません。または、間違った方法でサブクラス化を使用しましたか?

ありがとうございました!

答えて

1

あなたのUIViewがstoryboard/nibから来た場合は、イニシャライザである `init?(coder :)です。それで、あなたのコードはどこに行く必要があります。

initは実際には決して実行されません。 UIViewの2つの指定された初期化子は、init(frame:)(コードで作成されたUIView用)とinit(coder:)(ストーリーボードから作成されたビュー用)です。それらはあなたが上書きする必要があるものです。

+0

私はビューコントローラでビューを作成しました。私はそのビューにMainBottomViewクラスを与えました。ですから、私はinit()をinit(coder :)と置き換える必要がありますか? – da1lbi3

+0

それは私が言ったことだと思いますか? 'fatalError'を取り出し、' generateLabel'にあなたの呼び出しを置きます(もちろん、 'super'を呼び出します)。 – matt

+0

私はそれを少し違って実装しました、私はそれがこのように良いと思った(私の記事を参照)。しかし、それはまだ働いていません。 – da1lbi3

1

あなたはInfo.plistファイルに削除()のXcode 8.1(8B62)を、以下のアイデアを得るために、コードでストーリーボード、launchscreen、クリーンプロパティメインストーリーボードとLaunchscreenを遊んで次の内容のAppDelegate.swiftを置き換えることができ

import UIKit 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 
    var window: UIWindow? 
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     self.window = UIWindow(frame: UIScreen.main.bounds) 
     self.window!.rootViewController = ViewController() 
     self.window!.makeKeyAndVisible() 
     return true 
    } 
} 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.addSubview(MainBottomView()) 
    } 
} 

class MainBottomView : UIView{ 
    required init?(coder: NSCoder) {super.init(coder: coder)} 
    init() { 
     super.init(frame: UIScreen.main.bounds); 
     generateLabel(CGRect(x: 5, y: 363, width: 310, height: 62),tekst: "test") 
    } 

    func generateLabel(_ fr: CGRect,tekst: String){ 

     let l = UILabel(frame: fr) 
     l.backgroundColor = UIColor(red: (21/255.0),green: (185/255.0),blue:(201/255.0),alpha:1) 
     l.textAlignment = NSTextAlignment.center 
     l.text = tekst 
     l.textColor = UIColor.white 
     l.font = UIFont(name: "HelveticaNeue", size: 23) 
     self.addSubview(l) 
    } 
} 
関連する問題