2015-09-04 112 views
0
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() 
    } 


} 

我想创建3个pickerViews来选择一年,一个月和一天。还有一个标签showDateLabel,它应该显示结果(如2019 4 21)。UILabel返回零

当运行的模拟器,

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

总是显示在func showDateLabelSetting()一部分。我已经尝试了没有标签部分的运行模拟器,它可以正常运行。它也说

fatal error: unexpectedly found nil while unwrapping an Optional value 

在调试区域,只是我不知道该怎么办。

这是在调试区(我现在还不能确定哪一部分是有用的信息,所以我将它复制所有粘贴在这里)

左半部分

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 

右侧部分

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) 

任何人都可以告诉这里有什么问题,以及如何解决它?谢谢

+0

你的'showDateLabel'是否正确连接到故事板? –

+0

@ILikeTau这是我第一次以编程方式添加UILabel,所以我不知道该怎么做。不是'view.addSubview(showDateLabel)'意味着连接'showDateLabel'到故事板?或者我还应该做些什么来连接它? – morphymore

+0

我看到你没有初始化你的'UILabel',并认为你已经通过故事板完成了它。请记住,你需要它创建一个对象,然后才能使用它。 –

回答

0

showDateLabel尚未初始化。试试这个:

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) 
} 
+0

神奇的是,它的工作原理!非常感谢!你有没有想过读取调试区域信息,或者你知道这行在UILabel中是必需的?我想学习如何找到问题。谢谢! – morphymore

+0

你需要在使用它之前初始化'UILabel'(调用它的构造函数),否则它将被设置为'nil'。 –

+0

@morphymore您必须以@ILikeTau的形式初始化任何对象。而且你没有使用'IBOutlet'定义标签,所以我认为你只是忘记手动初始化它。 – Bannings