简体   繁体   中英

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. And there is a label showDateLabel which is supposed to show the result (like 2019 4 21).

When running simulator,

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

always shows in func showDateLabelSetting() part. 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. 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)
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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