在尝试调试我的问题一天之后,我只有到目前为止 - 我可以看到,在我创建了我的表然后搜索了我正在寻找的歌曲之后, table对象变为nil。
我不确定为什么会发生这种情况,以及如何防止这种情况发生。我忘记了什么吗?我做错了什么吗?
当我在桌面上发现.reloadData
时出现了所有问题'意外地出现了错误'
到目前为止,这是我的代码,使用print语句进行调试时有点麻烦:
import UIKit
protocol Filtering {
var filteredSongs: [SongDataHandler.SongDataHandlerItem]! { get set }
}
class SongPickerViewController: UIViewController, Filtering, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var SongPicker: UITableView!
var filteredSongs: [SongDataHandler.SongDataHandlerItem]! {
didSet {
print("About to reload...")
print(SongPicker)
if let songPicker = SongPicker {
songPicker.reloadData()
print("RELOADED DATA")
}
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toTable" {
let vc = segue.destination as! UserViewController
vc.delegate = self
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Setup table
print("Started setup")
SongPicker.delegate = self
SongPicker.dataSource = self
print("Finished setup, \(SongPicker)")
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("changing table ------")
if isEditing {
// Editing
return filteredSongs.count
}
return songHandler.songItems.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = SongPicker.dequeueReusableCell(withIdentifier: "cell")
if isEditing {
// Editing
cell?.imageView?.image = filteredSongs[indexPath.row].songImage
cell?.textLabel?.text = filteredSongs[indexPath.row].songName
cell?.detailTextLabel?.text = filteredSongs[indexPath.row].songArtist
return cell!
}
cell?.imageView?.image = songHandler[indexPath.row]?.songImage
cell?.textLabel?.text = songHandler[indexPath.row]?.songName
cell?.detailTextLabel?.text = songHandler[indexPath.row]?.songArtist
return cell!
}
}
连接完全正常。
我的搜索栏和表格如何:
搜索代码:
import UIKit
var isEditing = false
class UserViewController: UIViewController, Filtering, UISearchBarDelegate, UISearchControllerDelegate {
@IBOutlet weak var SearchBar: UISearchBar?
let searchController = UISearchController(searchResultsController: nil)
var filteredSongs: [SongDataHandler.SongDataHandlerItem]! {
didSet {
print("Detected in userVC")
}
}
var delegate: Filtering?// = SongPickerViewController()
override func viewDidLoad() {
super.viewDidLoad()
print("Search bar: \(SearchBar!)")
SearchBar?.delegate = self
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
navigationItem.searchController = searchController
definesPresentationContext = true
}
func findSearch(_ searchText: String) {
print(filteredSongs)
delegate?.filteredSongs = songHandler.songItems.compactMap { songItem in
print(songItem.songName.lowercased())
print(searchText.lowercased())
if songItem.songName.lowercased().contains(searchText.lowercased()) {
print("match!")
return songItem
}
else {
return nil
}
}
print("Filtered songs: \(filteredSongs)")
// Update table
print("table delecate: \(delegate)")
}
}
extension UserViewController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
print("checking")
}
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
print("search (clicked)")
findSearch(searchBar.text!)
}
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
isEditing = true
}
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
isEditing = false
}
}
答案 0 :(得分:1)
这是你的问题:
var delegate: Filtering? = SongPickerViewController()
您正在将代理设置为视图控制器的新实例,该实例未加载视图或已连接插座。
你需要做什么..你没有足够的代码来提供准确的答案,所以我会做出一些猜测/假设。
因此用户点击一个按钮或其他东西,转到带有segue(推定)的UserViewController
所以你可以打电话给performSegueWithIdentifier
然后你需要一个prepareForSegue
方法
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "myIdentifier" {
if let vc = segue.destination as? UserViewController {
vc.delegate = self
}
}
}
这样,您可以将委托设置为您正在使用的SongPickerViewController
的实际实例并加载其视图。
更新:查看源代码后,UserViewController是父视图控制器,SongPickerController是容器中的嵌入式ViewController。在与OP聊天之后,我建议了一个替代结构来解决这个问题,因此操作会重新解决问题。
答案 1 :(得分:0)
将我的所有代码移动到一个视图控制器后,它完美无缺地运行。我想我只是过于复杂,因为完全不需要两个视图控制器。
PS。我的原始代码中的isEditing
是UIViewController
的一部分,因此请使用isEditingSearch
或类似内容来防止覆盖错误。