2016-07-21 7 views
3

Ich habe ein Textfeld, das eine Tabellenansicht als Eingabeansicht darstellt. Ich möchte 2 Dinge zu dieser Tabellenansicht hinzufügen.Hinzufügen von Suchleiste programmgesteuert zu Tabellenansicht in Swift

1) eine Suchleiste hinzufügen.
2) fügen Sie die Schaltfläche "Abbrechen" oben in der Tabellenansicht hinzu.

class enterYourDealVC: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, UISearchDisplayDelegate, UISearchResultsUpdating { 
var tableView: UITableView = UITableView() 
let searchController = UISearchController(searchResultsController: nil) 

var dealAirports = [ 
    airPorts(name: "Airport1", shortcut: "AP1")!), 
    airPorts(name: "Airport2", shortcut: "AP2")!) 
] 
var filteredAirports = [airPorts]() 


//view did load 
    tableView = UITableView(frame: UIScreen.mainScreen().bounds, style: UITableViewStyle.Plain) 
    tableView.delegate  = self 
    tableView.dataSource = self 
    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") 

    searchController.searchResultsUpdater = self 
    searchController.dimsBackgroundDuringPresentation = false 
    definesPresentationContext = true 
    tableView.tableHeaderView = searchController.searchBar 
    toTextField.inputView = self.tableView 

//here is my search function 
func filterContentForSearchText(searchText: String, scope: String = "All") { 
    filteredAirports = dealAirports.filter { ap in 
     return ap.name.lowercaseString.containsString(searchText.lowercaseString) 
    } 

    tableView.reloadData() 
} 
} 

Das Problem ist mit diesem Code, es sucht nicht. Auch wenn ich auf die Suchleiste klicke, wird die Tabellenansicht geschlossen und ich kehrt zum Viewcontroller zurück. Wie kann ich das beheben?

und wie kann ich Abbrechen Schaltfläche zu dieser Tabellenansicht hinzufügen?

+0

UISearchController Apple-Beispielcode: [Apple-Beispielcode] (https://developer.apple.com/libr ary/ios/samplecode/TableSearch_UISearchController/Einführung/Intro.html) Dies wird Ihnen helfen, zu implementieren. – Chandan

+0

Es könnte mir helfen, wenn ich objektive c wüsste .. Es sieht sehr kompliziert für mich aus. Ich werde den Code weiter untersuchen. –

Antwort

1

Hier ist Code Snipet in Swift für das gleiche Für mehr verweisen Sie einfach Apple Doc im Kommentar erwähnt.

UISearchDisplayController in IOS8.0 ist veraltet, und empfohlen UISearchController

Hope this helfen Ihnen alot

ContactTVC

class ContactTVC:UITableViewController{ 
// MARK: Types 
/// State restoration values. 
enum RestorationKeys : String { 
    case viewControllerTitle 
    case searchControllerIsActive 
    case searchBarText 
    case searchBarIsFirstResponder 
} 

struct SearchControllerRestorableState { 
    var wasActive = false 
    var wasFirstResponder = false 
} 


/* 
The following 2 properties are set in viewDidLoad(), 
They an implicitly unwrapped optional because they are used in many other places throughout this view controller 
*/ 

/// Search controller to help us with filtering. 
var searchController: UISearchController! 

/// Secondary search results table view. 
var resultsTableController: ResultsTableController! 

/// Restoration state for UISearchController 
var restoredState = SearchControllerRestorableState() 
var arrayContacts: Array<CNContact> = [] 
var searchResultArrayContacts: Array<CNContact> = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    resultsTableController = ResultsTableController() 
// We want to be the delegate for our filtered table so didSelectRowAtIndexPath(_:) is called for both tables. 
    resultsTableController.tableView.delegate = self 

    searchController = UISearchController(searchResultsController: resultsTableController) 

    searchController.searchResultsUpdater = self 
    searchController.searchBar.sizeToFit() 
    tableView.tableHeaderView = searchController.searchBar 

    searchController.delegate = self 
    searchController.dimsBackgroundDuringPresentation = false // default is YES 
    searchController.searchBar.delegate = self // so we can monitor text changes + others 

    /* 
    Search is now just presenting a view controller. As such, normal view controller 
    presentation semantics apply. Namely that presentation will walk up the view controller 
    hierarchy until it finds the root view controller or one that defines a presentation context. 
    */ 

    definesPresentationContext = true 

} 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    // Restore the searchController's active state. 
    if restoredState.wasActive { 
     searchController.active = restoredState.wasActive 
     restoredState.wasActive = false 

     if restoredState.wasFirstResponder { 
      searchController.searchBar.becomeFirstResponder() 
      restoredState.wasFirstResponder = false 
     } 
    } 
} 

//MARK override TableViewDelegates/Datasource methods 
} 
extension ContactTVC: UISearchResultsUpdating{ 

// MARK: UISearchResultsUpdating 

func updateSearchResultsForSearchController(searchController: UISearchController) { 

     if let text = searchController.searchBar.text where (text.isEmpty == false){ 
     { 

          // Hand over the filtered results to our search results table. 

          let resultsController = searchController.searchResultsController as! ResultsTableController 

          resultsController.filteredProducts = Array(searchResult) 

          resultsController.tableView.reloadData() 

         dispatch_async(dispatch_get_main_queue(), { 
          self.tableViewContacts.reloadData() 
         }) 

       } 
     } 
} 
} 
//MARK: SearchBarDelegate 
extension ContactTVC: UISearchBarDelegate{ 

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

    if let text = searchBar.text where (text.isEmpty == false) { 

      // update the search result array by filtering…. 


       if searchResult.count > 0{ 

        self.searchResultArrayContacts = Array(searchResult) 
       } 
       else{ 

        self.searchResultArrayContacts = Array(self.arrayContacts) 
       } 

       dispatch_async(dispatch_get_main_queue(), { 
        self.tableViewContacts.reloadData() 
       }) 
    } 
} 


func searchBarCancelButtonClicked(searchBar: UISearchBar) { 

    searchBar.text = nil 
    searchBar.resignFirstResponder() 

} 
} 

/// Die Tabellenansicht zu verwenden Controller, der für die Anzeige der gefilterten Produkte verantwortlich ist, wenn der Benutzer in das Suchfeld eingibt.

class ResultsTableController: UITableViewController { 
// MARK: Properties 

let reusableIdentifier = "contactCell" 

var filteredProducts = [CNContact]() 

override func viewDidLoad() { 

    self.tableView.emptyDataSetSource = self 
    self.tableView.emptyDataSetDelegate = self 

} 


// MARK: UITableViewDataSource 
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return filteredProducts.count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = UITableViewCell(style: .Subtitle, reuseIdentifier: reusableIdentifier) 

    var contact = CNContact() 
    contact = filteredProducts[indexPath.row] 

    // Configure the cell... 
    cell.textLabel?.text = contact.givenName 

    let phones = contact.phoneNumbers[0].value as! CNPhoneNumber 

    cell.detailTextLabel?.text = phones.stringValue 

    return cell 
} 
} 

Dank

4

Dieses eine SeachBar

lazy var searchBar:UISearchBar = UISearchBar() 

override func viewDidLoad() 
{ 
    searchBar.searchBarStyle = UISearchBarStyle.Prominent 
    searchBar.placeholder = " Search..." 
    searchBar.sizeToFit() 
    searchBar.translucent = false 
    searchBar.backgroundImage = UIImage() 
    searchBar.delegate = self 
    navigationItem.titleView = searchBar 

} 

func searchBar(searchBar: UISearchBar, textDidChange textSearched: String) 
{ 
    ...your code... 
} 
1

// erste Schreib Delegat für die Suche "UISearchBarDelegate" // MARK hinzufügen wird: - Suchen-Taste Aktion

@IBAction func searchWithAddress(_ sender: Any) { 
let searchController = UISearchController(searchResultsController: nil) 
searchController.searchBar.delegate = self 
self.present(searchController, animated: true, completion: nil) 
}