我的视图控制器上有一个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)
}
}
但它在所需的init崩溃了吗?行。我不知道为什么会这样。或者我是否以错误的方式使用子类化?
非常感谢!
答案 0 :(得分:1)
如果您的UIView来自storyboard / nib,则init?(coder:)
是初始化程序。这就是你的代码需要去的地方。
事实上,你的init
可能永远不会运行。 UIView的两个指定初始化器是init(frame:)
(对于在代码中创建的UIView)和init(coder:)
(对于从故事板创建的视图)。那些是你需要覆盖的。
答案 1 :(得分:1)
您可以使用下面的代码来获取想法(Xcode 8.1(8B62))删除故事板,启动画面,清除属性主要故事板和Info.plist中的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)
}
}