Swift 子类化UIview问题

Swift 子类化UIview问题,swift,uiview,Swift,Uiview,我的视图控制器上有一个UIView。我想在屏幕上以编程方式绘制一些标签。所以我想我可以将其子类化,并在该类中将其子类化为UIView 我的代码: import Foundation import UIKit class MainBottomView : UIView{ required init?(coder aDecoder: NSCoder) { super.init(frame: UIScreen.main.bounds); generateL

我的视图控制器上有一个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)
    }
}
但它在要求的初始化时崩溃了?一行我不知道为什么会这样。还是我使用子类的方式不对


多谢各位

如果您的UIView来自故事板/nib,则初始化器是
init?(编码器:)
。这就是你的代码需要去的地方


实际上,您的
init
可能永远不会运行。UIView的两个指定初始值设定项是
init(frame:)
(对于在代码中创建的UIView)和
init(coder:)
(对于从情节提要创建的视图)。这些是您需要覆盖的内容。

您可以使用下面的代码来获得想法(Xcode 8.1(8B62))删除Info.plist中的故事板、启动屏幕、清理属性主故事板和启动屏幕,并用以下内容替换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)
    }
}

我已经在我的视图控制器上创建了一个视图,我将该视图命名为MainBottomView类。所以我需要用init(coder:)替换init()?我想这就是我说的,不是吗?只需取出
fatalError
并将您对
generateLabel
的调用放入即可(当然也可以调用
super
)。我已经实现了一些不同的功能,我认为这样更好(见我的帖子)。但它还没有起作用。