简体   繁体   English

UILabel返回nil

[英]UILabel returns nil

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    var pickerViewYears: UIPickerView!
    var pickerViewMonths: UIPickerView!
    var pickerViewDays: UIPickerView!
    var showDateLabel: UILabel!

    var years = [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020]
    var months = [01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12]
    var days = [01 ,02 ,03 ,04 ,05, 06, 07, 08, 09, 10 ,11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]

    override func viewDidLoad() {
        super.viewDidLoad()
        pickerViewYearsSetting()
        pickerViewMonthsSetting()
        pickerViewDaysSetting()
        showDateLabelSetting()
    }

    func pickerViewYearsSetting() {
        pickerViewYears = UIPickerView()
        pickerViewYears.frame = CGRectMake(0, 0, 100, 100)
        pickerViewYears.center.x = view.center.x - 100
        pickerViewYears.center.y = view.center.y
        view.addSubview(pickerViewYears)
        //pickerViewYears.layer.backgroundColor = UIColor(red: 255, green: 255, blue: 255, alpha: 0.5).CGColor

        pickerViewYears.dataSource = self
        pickerViewYears.delegate = self
    }

    func pickerViewMonthsSetting() {
        pickerViewMonths = UIPickerView()
        pickerViewMonths.frame = CGRectMake(0, 0, 100, 100)
        pickerViewMonths.center = view.center
        view.addSubview(pickerViewMonths)
        //pickerViewMonths.layer.backgroundColor = UIColor(red: 255, green: 255, blue: 255, alpha: 0.5).CGColor

        pickerViewMonths.dataSource = self
        pickerViewMonths.delegate = self
    }

    func pickerViewDaysSetting() {
        pickerViewDays = UIPickerView()
        pickerViewDays.frame = CGRectMake(0, 0, 100, 100)
        pickerViewDays.center.x = view.center.x + 100
        pickerViewDays.center.y = view.center.y
        view.addSubview(pickerViewDays)
        //pickerViewMonths.layer.backgroundColor = UIColor(red: 255, green: 255, blue: 255, alpha: 0.5).CGColor

        pickerViewDays.dataSource = self
        pickerViewDays.delegate = self
    }


    // returns the number of 'columns' to display.
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1

    }

    // returns the # of rows in each component..
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView == pickerViewYears {
            return years.count
        }
        else if pickerView == pickerViewMonths {
            return months.count
        }
        else {
            return days.count
        }
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
        if pickerView == pickerViewYears {
            return "\(years[row])"
        }
        else if pickerView == pickerViewMonths {
            return "\(months[row])"
        }
        else {
            return "\(days[row])"
        }
    }

    func showDateLabelSetting() {
        let selectedRowYears = pickerViewYears.selectedRowInComponent(0)
        let selectedRowMonths = pickerViewMonths.selectedRowInComponent(0)
        let selectedRowDays = pickerViewDays.selectedRowInComponent(0)
        showDateLabel.frame = CGRectMake(0, 0, 150, 100)
        showDateLabel.center.y = view.center.y + 150
        showDateLabel.center.x = view.center.x
        showDateLabel?.text = "\(years[selectedRowYears]) \(months[selectedRowMonths]) \(days[selectedRowDays])"

        view.addSubview(showDateLabel)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}

I am trying to create 3 pickerViews to select a year, a month, and a day. 我正在尝试创建3个pickerViews以选择一年,一个月和一天。 And there is a label showDateLabel which is supposed to show the result (like 2019 4 21). 并且有一个标签showDateLabel应该显示结果(例如2019 4 21)。

When running simulator, 运行模拟器时,

thread 1: 
exc_bad_instruction(code=exc_i386_invop,subcode=0x0) 

always shows in func showDateLabelSetting() part. 总是显示在func showDateLabelSetting()部分中。 And I have tried running simulator without the label part and it can run properly. 我尝试了运行没有标签部分的模拟器,它可以正常运行。 Also It says 还说

fatal error: unexpectedly found nil while unwrapping an Optional value

in the debug area just that I am not sure what to do about it. 在调试区域,只是我不确定该怎么做。

This is what in the debug area (I am still not sure which part is the useful info so I copy paste it all here) 这就是调试区域中的内容(我仍然不确定哪一部分是有用的信息,因此我将其全部粘贴在此处)

Left part 左半部

    self    
    PickerViewPractice001.ViewController    0x00007fdcabc250e0  
    UIKit.UIViewController  
    UIViewController        
    pickerViewYears UIPickerView!   0x00007fdcabd42300
    pickerViewMonths    UIPickerView!   0x00007fdcabd3f460
    pickerViewDays  UIPickerView!   0x00007fdcabd3f8c0
    showDateLabel   UILabel!    nil None
    years   [Int]   20 values   
    months  [Int]   12 values   
    days    [Int]   31 values   
    selectedRowYears    Int 0
    selectedRowMonths   Int 0
    selectedRowDays Int 0

Right part 右侧部分

2015-09-04 10:13:49.439 PickerViewPractice001[50739:3947139] -[UIPickerView setFrame:]: invalid height value 100.0 pinned to 162.0 
2015-09-04 10:13:49.439 PickerViewPractice001[50739:3947139] -[UIPickerView setFrame:]: invalid height value 100.0 pinned to 162.0 
2015-09-04 10:13:49.440 PickerViewPractice001[50739:3947139] -[UIPickerView setFrame:]: invalid height value 100.0 pinned to 162.0 
fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb) 

Can anyone tell what is the problem here and how to solve it? 谁能说出这里的问题是什么以及如何解决? Thanks 谢谢

The showDateLabel has not initialized. showDateLabel尚未初始化。 Try this: 尝试这个:

func showDateLabelSetting() {
    let selectedRowYears = pickerViewYears.selectedRowInComponent(0)
    let selectedRowMonths = pickerViewMonths.selectedRowInComponent(0)
    let selectedRowDays = pickerViewDays.selectedRowInComponent(0)
    showDateLabel = UILabel() // Added this line
    showDateLabel.frame = CGRectMake(0, 0, 150, 100)
    showDateLabel.center.y = view.center.y + 150
    showDateLabel.center.x = view.center.x
    showDateLabel?.text = "\(years[selectedRowYears]) \(months[selectedRowMonths]) \(days[selectedRowDays])"

    view.addSubview(showDateLabel)
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM