刷新所有组件我在我的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()**
}
}
我不知道为什么你在BooksClass创建chapterClass,只是委托传递chaptersClass.chaptersList0到你的ViewController,并分配给chaptersClass.chaptersList0目前chapterClass有!!!!然后调用self.chapterPickerView.reloadAllComponents()。我认为这会解决你的问题。 –