Ios 从搜索栏中获取文本,并使其在URL中可用

Ios 从搜索栏中获取文本,并使其在URL中可用,ios,swift,Ios,Swift,我正在尝试创建一个应用程序,从myanimelist.net查看动画。我已经编写了代码来解析文本并显示数据,但到目前为止,它只显示来自特定URL的数据,例如 https://myanimelist.net/api/anime/search.xml?q=sword+art+online 我试图让搜索栏文本通过我的链接,这样它就可以动态搜索,而不是一次只搜索一部动画,比如 https://myanimelist.net/api/anime/search.xml?q=(search term her

我正在尝试创建一个应用程序,从myanimelist.net查看动画。我已经编写了代码来解析文本并显示数据,但到目前为止,它只显示来自特定URL的数据,例如

https://myanimelist.net/api/anime/search.xml?q=sword+art+online
我试图让搜索栏文本通过我的链接,这样它就可以动态搜索,而不是一次只搜索一部动画,比如

https://myanimelist.net/api/anime/search.xml?q=(search term here)
这是URL所在的代码

private func fetchData()
    {
        let feedParser = FeedParser()
        feedParser.parseFeed(url: "https://myanimelist.net/api/anime/search.xml?q=")
            {
            (animeItems) in
                self.animeItems = animeItems
                OperationQueue.main.addOperation
                    {
                    self.tableView.reloadSections(IndexSet(integer: 0), with: .left)
                    }
            }
    }
这是我必须在TableViewController中搜索URL的代码

以下是处理HTTP身份验证的XMLparser.swift中的位

   func parseFeed(url: String, completionHandler: (([AnimeItem]) -> Void)?)
    {
        self.parserCompletionHandler = completionHandler


        //task.resume()
        let username = "MALPocket"
        let password = "qpwoeiruty"
        let logindata = String(format : "%@:%@", username, password).data(using: String.Encoding.utf8)!
        let base64String = logindata.base64EncodedString()
        var request = URLRequest(url: URL(string: url)!)
        request.httpMethod = "GET"
        request.setValue("Basic \(base64String)", forHTTPHeaderField: "Authorization")

        let urlSession = URLSession.shared
        let task = urlSession.dataTask(with: request) { (data, response, error) in
            guard let data = data else
            {
                if let error = error
                {
                    print(error.localizedDescription)
                }

                return
            }
            print(data)

            /// parse the xml data
            let parser = XMLParser(data: data)
            parser.delegate = self
            parser.parse()
        }



        task.resume()
    }
我试过做一些事情,比如

  func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
    {
    }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar, textDidChange searchText: String)
    {
        self.tableView.reloadData()
    }
并尝试将searchText保存到变量中以添加到链接中,如

feedParser.parseFeed(url: "https://myanimelist.net/api/anime/search.xml?q=\(searchText)")

但是我尝试过的每件事都会以未解决的标识符错误或更糟的错误告终。

很难确切地说出错误是什么,但可能需要对搜索词进行编码,以便它可以与URL中的查询一起使用。幸运的是,Swift支持这一内置功能:

let encodedSearchTerm = searchText.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
feedParser.parseFeed(url: "https://myanimelist.net/api/anime/search.xml?q=\(encodedSearchTerm)") { animeItems in
// Do something with your animeItems
}
下面是一个如何在视图控制器中使用的示例。我不知道您的设置是什么样的,所以这可能会有所不同,所以这只是一个示例:

class MyViewController: UIViewController, UISearchBarDelegate {

    @IBOutlet var searchBar: UISearchBar!

    private let feedParser = FeedParser()

    override func viewDidLoad() {
        super.viewDidLoad()
        searchBar.delegate = self
    }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        let searchText = searchBar.text ?? ""
        let encodedSearchTerm = searchText.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
        feedParser.parseFeed(url: "https://myanimelist.net/api/anime/search.xml?q=\(encodedSearchTerm)") { animeItems in
            // Do something with your animeItems
        }
    }

}

设法修复它,下面是代码

override func viewDidLoad()
{
    super.viewDidLoad()
    searchBar.delegate = self

    fetchData(searchTerm: nil)
    tableview.reloadData()
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
{
    print("search Text: \(searchText)")
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
{
    self.fetchData(searchTerm: searchBar.text)
}


func fetchData(searchTerm: String?)
{
    var components = URLComponents(string: "https://myanimelist.net/api/anime/search.xml")

    if let searchTerm = searchTerm {
        components?.queryItems = [URLQueryItem(name: "q", value: searchTerm)]
    }

    guard let urlString = components?.url?.absoluteString else { return }
    feedParser.parseFeed(url: urlString){ (animeItems) in
            self.animeItems = animeItems
            OperationQueue.main.addOperation
                {
                self.tableView.reloadSections(IndexSet(integer: 0), with: .left)
                }
        }
}
在此之后,搜索工作正常,它不会正确地执行第二次搜索,因为数组没有重置,所以我还将其添加到解析器代码中,以删除数组并重新开始,现在搜索工作正常了

animeItems.removeAll()

我假设这是为了替换原来的feedParser.parseFeed(url:)?我试着这样做,但我得到了两个错误,1-使用未解析标识符“searchText”2括号在这里形成一个尾随闭包,由多个换行符将其与被调用方分隔。我刚刚处理了您的最后一行。您需要将其放在可以获取搜索文本的某个位置,无论是在
textDidChange
的回调中,还是通过获取
searchBar.text
其他地方。我已更新了答案以获得Closure我已尝试移动
让encodedSearchTerm=searchText.addingPercentEncoding(使用AllowedCharacters:.urlQueryAllowed)?”“
在使用
func searchBar
func searchBar searchbutton时,单击了
但我无法使encodedSearchTerm正常工作,我只是得到了错误
使用未解析标识符'encodedSearchTerm'
,除非我试图将其放在错误的位置。您需要将我的所有代码放在一起,因为第二行使用了第一行定义的
encodedSearchTerm
。如果单独移动它们,您将得到一个错误,因为它无法从代码中的其他地方访问
encodedSearchTerm
。我添加了一个更完整的答案。请仔细查看代码,尝试了解发生了什么,因为如果不了解您是如何设置的,我将无能为力。