使用UISearchBar时,UITableView变为nil

时间:2018-06-14 20:15:26

标签: ios swift uitableview

在尝试调试我的问题一天之后,我只有到目前为止 - 我可以看到,在我创建了我的表然后搜索了我正在寻找的歌曲之后, 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!
    }

}

连接完全正常。

我的搜索栏和表格如何:

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

2 个答案:

答案 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。我的原始代码中的isEditingUIViewController的一部分,因此请使用isEditingSearch或类似内容来防止覆盖错误。