我最近潜入了Swift 3和Xcode 8的世界,并且一直在研究一个简单的游戏,以便尽可能多地学习,但是我遇到了一个问题,当我自定义类因为它进入它时崩溃了我拖进它的IBOutlets是零。
我正在使用StoryBoard
和AutoLayout
,并已从故事板中将多个字段拖到我的班级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
。
我有点难以理解视图控制器,自定义滚动视图和出口为零之间存在的关系。如果有人能澄清我会非常感激。
谢谢!