gpt4 book ai didi

swift - UISearchBar textDidChange 来自 plist 的数据

转载 作者:行者123 更新时间:2023-11-30 12:19:11 25 4
gpt4 key购买 nike

我想搜索我的 plist 中的项目。 plist 由一组字典组成。每个键/值代表字符串/整数等,但这并不重要。

正如您将在下面的 tableViewController 类中看到的,我当前已经输入了一个数组。我知道我需要从我的 plist 中创建一个对象/项目数组,但我无法弄清楚如何在 View Controller 中引用 plist 中的对象。

查看controller.swift文件:

import UIKit

class TableViewController: UITableViewController, UISearchResultsUpdating {

var array = ["Example 1", "Example 2", "Example 3"]
var filteredArray = [String]()
var searchController = UISearchController()
var resultsController = UITableViewController()

override func viewDidLoad() {
super.viewDidLoad()

searchController = UISearchController(searchResultsController: resultsController)
tableView.tableHeaderView = searchController.searchBar
searchController.searchResultsUpdater = self

resultsController.tableView.delegate = self
resultsController.tableView.dataSource = self
}

//Added func to update search results
func updateSearchResults(for searchController: UISearchController) {
filteredArray = array.filter({ (array:String) -> Bool in
if array.contains(searchController.searchBar.text!) {
return true
} else {
return false
}
})
resultsController.tableView.reloadData()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}

extension TableViewController {

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == resultsController.tableView {
return filteredArray.count
} else {
return array.count
}
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()

if tableView == resultsController.tableView {
cell.textLabel?.text = filteredArray[indexPath.row]
} else {
cell.textLabel?.text = array[indexPath.row]
}
return cell
}
}

我尝试通过 plist 教程创建一个对象类来解决这个问题。它使用元素周期表的示例:

import UIKit

struct Element {
enum State: String {
case Solid, Liquid, Gas
}

let atomicNumber: Int
let atomicWeight: Float
let discoveryYear: String
let group: Int
let name: String
let period: Int
let radioactive: Bool
let state: State
let symbol: String

// Position in the table
let horizPos: Int
let vertPos: Int
}

extension Element {
enum ErrorType: Error {
case noPlistFile
case cannotReadFile
}

/// Load all the elements from the plist file
static func loadFromPlist() throws -> [Element] {
// First we need to find the plist
guard let file = Bundle.main.path(forResource: "Element", ofType: "plist") else {
throw ErrorType.noPlistFile
}

// Then we read it as an array of dict
guard let array = NSArray(contentsOfFile: file) as? [[String: AnyObject]] else {
throw ErrorType.cannotReadFile
}

// Initialize the array
var elements: [Element] = []

// For each dictionary
for dict in array {
// We implement the element
let element = Element.from(dict: dict)
// And add it to the array
elements.append(element)
}

// Return all elements
return elements
}

/// Create an element corresponding to the given dict
static func from(dict: [String: AnyObject]) -> Element {
let atomicNumber = dict["atomicNumber"] as! Int
let atomicWeight = Float(dict["atomicWeight"] as! String) ?? 0
let discoveryYear = dict["discoveryYear"] as! String
let group = dict["group"] as! Int
let name = dict["name"] as! String
let period = dict["period"] as! Int
let radioactive = dict["radioactive"] as! String == "True"
let state = State(rawValue: dict["state"] as! String)!
let symbol = dict["symbol"] as! String
let horizPos = dict["horizPos"] as! Int
let vertPos = dict["vertPos"] as! Int

return Element(atomicNumber: atomicNumber,
atomicWeight: atomicWeight,
discoveryYear: discoveryYear,
group: group,
name: name,
period: period,
radioactive: radioactive,
state: state,
symbol: symbol,
horizPos: horizPos,
vertPos: vertPos)
}
}

并且在 viewController 类中,而不是

var array = ["Example 1", "Example 2", "Example 3"]

我尝试过各种变体

var array = Element["name"]

var array = elements.name

但它们显然不起作用,因为对 plist 的引用位于对象类中。

如果有人知道如何使用 swift 3/xcode 8 解决这个问题,我将非常感激!!

最佳答案

我希望您的问题仍然有意义。据我了解,您无法过滤数组,对吗?如果是这样,我建议您看看thisthis教程。它们都代表了加载过滤数组的稍微不同的方法,但这并不重要,它们都有效。

附注如果您想以后自定义它,我不建议您制作一个特殊的 tableView 来进行搜索,因为稍后您将不得不以编程方式完成它。这样做会更有效:

  If searchController.isActive {
// do some stuff
} else { // another stuff }

但这只是我的意见。我希望我的问题能有所帮助;)。

关于swift - UISearchBar textDidChange 来自 plist 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45010510/

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