自定义UIScrollView类未初始化IBOutlets

时间:2016-12-17 02:41:30

标签: ios swift xcode

我最近潜入了Swift 3和Xcode 8的世界,并且一直在研究一个简单的游戏,以便尽可能多地学习,但是我遇到了一个问题,当我自定义类因为它进入它时崩溃了我拖进它的IBOutlets是零。

我正在使用StoryBoardAutoLayout,并已从故事板中将多个字段拖到我的班级statistics:UIScrollView中。

class StatisticsView: UIScrollView, sendLabelDelegate {

    @IBOutlet weak var GamesWonNum: UILabel!

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.GamesWonNum = aDecoder.decodeObject(forKey: "GamesWonNum") as! UILabel!
    }

    override func encode(with aCoder: NSCoder) {
        aCoder.encode(self.GamesWonNum, forKey: "GamesWonNum")

    }

    func setLabel(data: String) {
        let temp = Int(data)
        setNumber(num: temp!)
    }

    override func awakeFromNib() { }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    func setNumber(num: Int){
        GamesWonNum.text = String(num)
    }
}

我确保将统计类设置为storyboard scrollview的标识符。我已经对这个主题做了很多研究,但我找不到具体的答案。我在另一篇文章中发现,调用函数awakefromNib()将解决问题但它有,但我想了解awakefromNib()做了什么以及为什么我不能简单地init()视图。

我的视图控制器层次结构如下:

MainMenuVC | --Segue - > SettingsVC

MainMenyVC | --Segue - > StatisticsVC

class StatisticsVC: UIViewController, sendLabelDelegate{

    @IBOutlet weak var StatsScrollView: UIScrollView!

    var settingsLabel:String = ""

    override func viewDidLoad() {
        super.viewDidLoad()


        if UIScreen.main.bounds.height < 600 {
            StatsScrollView.contentSize.height = 700
            print("screensizeif: \(UIScreen.main.bounds.height), \(StatsScrollView.contentSize.height)")
        }else{
            StatsScrollView.contentSize.height = UIScreen.main.bounds.height
            print("screensizeelse: \(UIScreen.main.bounds.height), \(StatsScrollView.contentSize.height)")
        }
        StatsScrollView.contentSize.width = UIScreen.main.bounds.width
        StatsScrollView.isUserInteractionEnabled = true

    }

    func setLabel(data: String) {
        settingsLabel = data
    }

    override var shouldAutorotate: Bool {
        return true
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if UIDevice.current.userInterfaceIdiom == .phone {
            return .allButUpsideDown
        } else {
            return .all
        }
    }
}

我的理解是viewController会在进入viewdidLoad()函数之前初始化它的所有视图,那么为什么awakefromNib()是必需的以及我应该在其中定义什么。此外,为什么我不能在init()内初始化类?如果我尝试在init()内设置GamesWon Outlet,则插座为nil

我有点难以理解视图控制器,自定义滚动视图和出口为零之间存在的关系。如果有人能澄清我会非常感激。

谢谢!

0 个答案:

没有答案