我将发布一些代码,这些代码是在用户R menke和其他人的帮助下完成的。我的目标是拥有一个GenericListProtocol,可以处理UISearchBarDelegate、UITableViewDelegate和我的getData方法(需要一个类型类才能正确解析json)。
import Foundation
import UIKit
protocol GenericListProtocol : UISearchBarDelegate, UITableViewDelegate{
typealias T : MyModel
var list : [T] { get set }
var filteredlist : [T] { get set }
var searchActive : Bool { get set }
func setData(tableView : UITableView, myList : [T])
func setData()
func getData(tableView : UITableView, objectType : T, var myList : [T])
func filterContentForSearchText(searchText: String)
}
extension GenericListProtocol {
func setData(atableView : UITableView, myList : [T]) {
print("reloading tableView data")
atableView.reloadData()
}
func getData(tableView : UITableView, objectType : T, var myList : [T]) {
let dao: GenericDao<T> = GenericDao<T>()
let view : UIView = UIView()
let c: CallListListener<T> = CallListListener<T>(view: view, loadingLabel: "loading", save: true, name: "ProductModel")
c.onSuccess = { (onSuccess: JsonMessageList<T>) in
print("status " + onSuccess._meta!.status!)
myList = onSuccess.records
self.setData(tableView, myList: myList)
}
c.onFinally = { (any: AnyObject) in
}
let savedList = c.getDefaultList()
if (savedList == nil) {
dao.getAll(c);
}
else {
myList = savedList!
print(String(myList.count))
self.setData(tableView, myList: myList)
}
}
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
searchActive = true;
}
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
searchActive = false;
}
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
searchActive = false;
}
func searchBarSearchButtonClicked(searchBar: UISearchBar) {
searchActive = false;
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
print("searching")
self.filterContentForSearchText(searchText)
if(filteredlist.count == 0){
searchActive = false;
} else {
searchActive = true;
}
self.setData()
}
}
虽然我已经能够实现大部分UISearchBarDelegate和UITableViewDelegate方法,但我仍需要在我的默认类中实现其中的两个:
import Foundation
import UIKit
import EVReflection
import AlamofireJsonToObjects
class ProductListController : GenericListController, GenericListProtocol {
@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var tableView: UITableView!
var list : [ProductModel] = [ProductModel]()
var filteredlist : [ProductModel] = [ProductModel]()
var searchActive : Bool = false
override func setInit() {
self.searchBar.delegate = self
self.listName = "ProductModel"
self.setTableViewStyle(self.tableView, searchBar4 : self.searchBar)
getData(self.tableView, objectType: ProductModel(), myList: self.list)
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
self.filterContentForSearchText(searchText)
if(filteredlist.count == 0){
searchActive = false;
} else {
searchActive = true;
}
self.setData(self.tableView, myList: list)
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searchActive {
return self.filteredlist.count
} else {
return self.list.count
}
}
func setData(atableView: UITableView, myList : [ProductModel]) {
print(String(myList.count))
self.list = myList
print(String(self.list.count))
self.tableView.reloadData()
}
func setData() {
self.tableView.reloadData()
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:GenericListCell = tableView.dequeueReusableCellWithIdentifier("cell") as! GenericListCell
var object : ProductModel
if searchActive {
object = filteredlist[indexPath.row]
} else {
object = list[indexPath.row]
}
cell.formatData(object.name!, subtitle: object.price ?? "valor", char: object.name!)
print("returning cell")
return cell
}
override func viewDidLoad() {
super.viewDidLoad()
}
func filterContentForSearchText(searchText: String) {
self.filteredlist = self.list.filter({( object: ProductModel) -> Bool in
let stringMatch = object.name!.lowercaseString.rangeOfString(searchText.lowercaseString)
return (stringMatch != nil)
})
}
func formatCell(cell : GenericListCell, object : ProductModel) {
cell.formatData(object.name!, subtitle: object.price ?? "valor", char: object.name!)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
*GenericListController只是一个带有一些辅助方法的UIViewController。