2015-09-04 110 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