2016-10-31 2 views
-1

У меня есть 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 поступает из раскадровки/ниба, это `init? (Coder :), что - это инициализатор. Вот где ваш код должен идти.

Ваш init, по сути, вероятно, никогда не запустится. Два назначенных инициализатора для UIView - init(frame:) (для UIView, созданных в коде) и init(coder:) (для представления, созданного с раскадровки). Это те, которые вам нужно переопределить.

+0

Я создал представление у своего контроллера представления, я дал это представление классу MainBottomView. Так что мне нужно заменить init() на init (coder :)? – da1lbi3

+0

Я думаю, это то, что я сказал, не так ли? Просто возьмите 'fatalError' и положите свой вызов на' generateLabel' (и, конечно же, на 'super'). – matt

+0

Я реализовал это немного по-другому, я подумал, что так лучше (см. Мой пост). Но он пока не работает. – da1lbi3

1

Вы можете играть с кодом ниже, чтобы получить представление (Xcode 8.1 (8B62)) Удалить раскадровку, launchscreen, Чистые свойства Главная раскадровку и Launchscreen в 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) 
    } 
}