2016-09-26 34 views
0

刷新所有组件我在我的ViewController 2个UIPickerViews。每个选择器视图都有一个独立的swift文件,充当选取器的数据源和委托。我想在第二pickerView的行数依赖于第一pickerView选择的行。当我尝试在第一pickerView的“didSelect”功能来实现这一点,我得到一个错误:“意外发现零而展开的可选值”UIPickerView:从另一个迅速文件

这里是我的代码:

ViewController.swift:

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet var bookPickerView: UIPickerView! 
    @IBOutlet var chapterPickerView: UIPickerView! 

    var booksClass: BooksClass! 
    var chaptersClass: ChaptersClass! 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    booksClass = BooksClass() 
    chaptersClass = ChaptersClass() 

    bookPickerView.delegate = booksClass 
    bookPickerView.dataSource = booksClass 

    chapterPickerView.delegate = chaptersClass 
    chapterPickerView.dataSource = chaptersClass 

    chaptersClass.chaptersList = chaptersClass.chaptersList0 
    }  
} 

ChaptersClass.swift:

import UIKit 

class ChaptersClass: UIPickerView, UIPickerViewDelegate, UIPickerViewDataSource { 

    var chaptersList: [String]! 

    func numberOfComponents(in: UIPickerView) -> Int { 
    return 1 
    } 

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return chaptersList.count 
    } 
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    return chaptersList[row] 
    } 

    //Number of chapters for each book: 
    var chaptersList0: [String]! = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37"] 

    var chaptersList1: [String]! = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"] 

    var chaptersList2: [String]! = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27"] 
} 

BooksClass.swift:

import UIKit 

class BooksClass: UIPickerView, UIPickerViewDelegate, UIPickerViewDataSource { 

    var viewController: ViewController! 
    var chaptersClass: ChaptersClass! 

    var booksList: [String]! = ["Jenesis", "Exodus", "Livitikōs"] 

    func numberOfComponents(in: UIPickerView) -> Int { 
    return 1 
    } 

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return booksList.count 
    } 

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    return booksList[row] 
    } 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    chaptersClass = ChaptersClass() 
    viewController = ViewController() 
    switch row { 
     case 0: 
     chaptersClass.chaptersList = chaptersClass.chaptersList0 
     case 1: 
     chaptersClass.chaptersList = chaptersClass.chaptersList1 
     case 2: 
     chaptersClass.chaptersList = chaptersClass.chaptersList2 
     default: 
     return 
    } 
    viewController.chapterPickerView.reloadAllComponents() 
    } 
} 

错误发生在下面一行我BooksClass.swift文件:

viewController.chapterPickerView.reloadAllComponents() 

UPDATE: @Sanchit库马尔·辛格

我已经更新我的帮助代码Sanchit的建议。我目前没有得到任何错误,但“章节” pickerView仍然没有出于某种原因更新。任何人都可以指出我做错了什么?

注:我修改了 “ViewController.swift” 和 “BooksClass.swift” 文件。我的代码中的新条目被**星号**包围。

ViewController.swift:

import UIKit 

class ViewController: UIViewController, **BooksClassDelegate** { 

    @IBOutlet var bookPickerView: UIPickerView! 
    @IBOutlet var chapterPickerView: UIPickerView! 

    var booksClass: BooksClass! 
    var chaptersClass: ChaptersClass! 

    **func updateChaptersList() {** 
    **self.chapterPickerView.reloadAllComponents()** 
    **}** 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    booksClass = BooksClass() 
    chaptersClass = ChaptersClass() 

    bookPickerView.delegate = booksClass 
    bookPickerView.dataSource = booksClass 

    chapterPickerView.delegate = chaptersClass 
    chapterPickerView.dataSource = chaptersClass 

    chaptersClass.chaptersList = chaptersClass.chaptersList0 

    **booksClass.referenceToViewController = self** 
    }  
} 

BooksClass.swift:

import UIKit 

**protocol BooksClassDelegate {** 
    **func updateChaptersList()** 
**}** 

class BooksClass: UIPickerView, UIPickerViewDelegate, UIPickerViewDataSource { 

    var viewController: ViewController! 
    var chaptersClass: ChaptersClass! 
    **var referenceToViewController: BooksClassDelegate?** 

    var booksList: [String]! = ["Jenesis", "Exodus", "Livitikōs"] 

    func numberOfComponents(in: UIPickerView) -> Int { 
    return 1 
    } 

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return booksList.count 
    } 

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    return booksList[row] 
    } 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    chaptersClass = ChaptersClass() 
    switch row { 
     case 0: 
     chaptersClass.chaptersList = chaptersClass.chaptersList0 
     case 1: 
     chaptersClass.chaptersList = chaptersClass.chaptersList1 
     case 2: 
     chaptersClass.chaptersList = chaptersClass.chaptersList2 
     default: 
     return 
    } 
    **referenceToViewController?.updateChaptersList()** 
    } 
} 
+0

我不知道为什么你在BooksClass创建chapterClass,只是委托传递chaptersClass.chaptersList0到你的ViewController,并分配给chaptersClass.chaptersList0目前chapterClass有!!!!然后调用self.chapterPickerView.reloadAllComponents()。我认为这会解决你的问题。 –

回答

0

我在你的didSelectRow功能看到的唯一问题即

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
chaptersClass = ChaptersClass() 
**viewController = ViewController()** 
switch row { 
    case 0: 
    chaptersClass.chaptersList = chaptersClass.chaptersList0 
    case 1: 
    chaptersClass.chaptersList = chaptersClass.chaptersList1 
    case 2: 
    chaptersClass.chaptersList = chaptersClass.chaptersList2 
    default: 
    return 
} 
viewController.chapterPickerView.reloadAllComponents() 

}

是,为什么是你初始化一个新的ViewController。见,主要的问题是你刚才初始化的视图控制器类,但没有将其添加到您的视图层次所以viewDidLoad中不会被调用,这将进一步导致chaptersList在chaptersClass到零,因为它从来没有设置。

我想你想使用已经存在于你的视图层次结构中的相同的viewcontroller实例,因为你需要使用委托或其他方式来通知你已经存在的viewcontroller实例。我将这部分留给你。我认为这会解决你的问题。

+0

感谢您的快速响应,Sanchit!我继续使用您的建议,但出于某种原因,我仍然遇到错误。有可能我没有正确使用我的新代表。请参阅上面更新后的帖子以及我的更改。任何进一步的援助将不胜感激。 –

+0

你能解决你的问题吗? –