gpt4 book ai didi

ios - 使用 UISearchBar 时 UITableView 变为 nil

转载 作者:行者123 更新时间:2023-11-28 14:36:26 25 4
gpt4 key购买 nike

在尝试调试我的问题一天之后,我只得到了到目前为止 - 我可以看到在我创建了我的表之后然后搜索了我正在寻找的歌曲的内容,表对象变为零。

我不确定为什么会发生这种情况,以及我将如何防止这种情况发生。我忘记了什么吗?我做错了什么吗?

当我在表上发现 .reloadData 时,所有问题都开始发生“意外地得到了一个 nil 错误”

到目前为止,这是我的代码,使用 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!
}

}

连接完全正常。

我的搜索栏和表格的样子:

enter image description here

搜索代码:

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
}
}

最佳答案

这是你的问题:

var 委托(delegate):过滤? = SongPickerViewController()

您正在将委托(delegate)设置为 View Controller 的一个实例,该 View Controller 尚未加载 View 或连接 socket 。

您需要做什么..您没有显示足够的代码来获得准确的答案,所以我将进行一些猜测/假设。

所以用户点击一个按钮或其他东西,通过 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
}
}
}

通过这种方式,您可以将委托(delegate)设置为您正在使用并已加载其 View 的 SongPickerViewController 的实际实例。

更新:查看源代码后,UserViewController 是父 View Controller ,SongPickerController 是容器中的嵌入式 ViewController。与 OP 交谈后,我建议使用替代结构来解决该问题,因此 OP 将重新处理该问题。

关于ios - 使用 UISearchBar 时 UITableView 变为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50865248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com