Die Dokumentation für UISearchController
besagt, dass Sie - searchBar
überschreiben können, um eine benutzerdefinierte Unterklasse von UISearchBar
für den Controller zu verwenden. Die benutzerdefinierte Suchleiste wird verwendet und ihre eigenen Delegate-Methoden werden korrekt aufgerufen, aber die Methode UISearchResultsUpdating
wird nicht mehr aufgerufen, wenn sich die Suchleiste ändert. Muss ich viele Dinge manuell erledigen, oder fehlt mir etwas, damit sich der Controller verhält wie bei einer nativen Suchleiste?Benutzerdefinierte UISearchBar mit UISearchController
Antwort
Dies ist ein bekannter Fehler. Leider gibt es keine Problemumgehung, die keine private API umfasst.
Können Sie das näher ausführen? Ich kann dieses Problem nicht als einen bekannten Fehler bezeichnen. – pbuchheit
@Alex UISearchController ist nur in iOS 8 und höher verfügbar. Der Compiler erkennt die Klasse in iOS 7 und darunter nicht. Bleiben Sie bei UISearchDisplayController, bis Sie nur iOS 8 und höher unterstützen. –
@MyztikJenz, wissen Sie, ob es irgendwelche Änderungen in Bezug auf diesen Fehler gab? Mein Problem ist, dass die Suchergebnistabelle nicht vollständig angezeigt wird, da 'UISearchResultsUpdating' nicht bei Suchtextänderungen mit einer benutzerdefinierten' UISearchBar' aufgerufen wird. – artooras
Ich denke, es soll sich so verhalten.
Dies ist von UISearchController.h
// You are free to become the search bar's delegate to monitor for text changes and button presses.
@property (nonatomic, retain, readonly) UISearchBar *searchBar;
dass alle Delegatmethode (updateSearchResultsForSearchController :) tut, ist Ihre Suche Controller zurückzukehren und seine Suchleiste zugreifen können.
Sie können dies einfach über Ihre benutzerdefinierten Suchleiste Delegate Methoden tun.
Wenn Sie UISearchController ableiten, können Sie UISearchBar in Getter anpassen (Setter existiert nicht).
Beispiel - in der Unterklasse Implementierung:
-(UISearchBar*)searchBar{
UISearchBar *baseSearchBar = [super searchBar];
if (baseSearchBar.showsScopeBar) {
baseSearchBar.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 88);
}else{
baseSearchBar.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 44);
}
return baseSearchBar;
}
Hope this jemand hilft.
Aber es hat mir sehr geholfen. –
Aufschalten der SearchBar Getter in Ihrer benutzerdefinierten UISearchController Klasse, es Ihre benutzerdefinierten SearchBar zurückkehren müssen und es haben bereits initialisiert werden, dann sind Sie Setup seine Eigenschaften erst nach dem UISearchController init, auf diese Weise die alle UISearchController Funktionalität beibehalten:
public class DSearchController: UISearchController {
private var customSearchBar = DSearchBar()
override public var searchBar: UISearchBar {
get {
return customSearchBar
}
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
public init(searchResultsController: UIViewController?,
searchResultsUpdater: UISearchResultsUpdating?,
delegate: UISearchControllerDelegate?,
dimsBackgroundDuringPresentation: Bool,
hidesNavigationBarDuringPresentation: Bool,
searchBarDelegate: UISearchBarDelegate?,
searchBarFrame: CGRect?,
searchBarStyle: UISearchBarStyle,
searchBarPlaceHolder: String,
searchBarFont: UIFont?,
searchBarTextColor: UIColor?,
searchBarBarTintColor: UIColor?, // Bar background
searchBarTintColor: UIColor) { // Cursor and bottom line
super.init(searchResultsController: searchResultsController)
self.searchResultsUpdater = searchResultsUpdater
self.delegate = delegate
self.dimsBackgroundDuringPresentation = dimsBackgroundDuringPresentation
self.hidesNavigationBarDuringPresentation = hidesNavigationBarDuringPresentation
customSearchBar.setUp(searchBarDelegate,
frame: searchBarFrame,
barStyle: searchBarStyle,
placeholder: searchBarPlaceHolder,
font: searchBarFont,
textColor: searchBarTextColor,
barTintColor: searchBarBarTintColor,
tintColor: searchBarTintColor)
}
}
Und das ist meine Gewohnheit SearchBar:
public class DSearchBar: UISearchBar {
var preferredFont: UIFont?
var preferredTextColor: UIColor?
init(){
super.init(frame: CGRect.zero)
}
func setUp(delegate: UISearchBarDelegate?,
frame: CGRect?,
barStyle: UISearchBarStyle,
placeholder: String,
font: UIFont?,
textColor: UIColor?,
barTintColor: UIColor?,
tintColor: UIColor?) {
self.delegate = delegate
self.frame = frame ?? self.frame
self.searchBarStyle = searchBarStyle
self.placeholder = placeholder
self.preferredFont = font
self.preferredTextColor = textColor
self.barTintColor = barTintColor ?? self.barTintColor
self.tintColor = tintColor ?? self.tintColor
self.bottomLineColor = tintColor ?? UIColor.clearColor()
sizeToFit()
// translucent = false
// showsBookmarkButton = false
// showsCancelButton = true
// setShowsCancelButton(false, animated: false)
// customSearchBar.backgroundImage = UIImage()
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
let bottomLine = CAShapeLayer()
var bottomLineColor = UIColor.clearColor()
override public func layoutSubviews() {
super.layoutSubviews()
for view in subviews {
if let searchField = view as? UITextField { setSearchFieldAppearance(searchField); break }
else {
for sView in view.subviews {
if let searchField = sView as? UITextField { setSearchFieldAppearance(searchField); break }
}
}
}
bottomLine.path = UIBezierPath(rect: CGRectMake(0.0, frame.size.height - 1, frame.size.width, 1.0)).CGPath
bottomLine.fillColor = bottomLineColor.CGColor
layer.addSublayer(bottomLine)
}
func setSearchFieldAppearance(searchField: UITextField) {
searchField.frame = CGRectMake(5.0, 5.0, frame.size.width - 10.0, frame.size.height - 10.0)
searchField.font = preferredFont ?? searchField.font
searchField.textColor = preferredTextColor ?? searchField.textColor
//searchField.backgroundColor = UIColor.clearColor()
//backgroundImage = UIImage()
}
}
Init Beispiel:
searchController = DSearchController(searchResultsController: ls,
searchResultsUpdater: self,
delegate: self,
dimsBackgroundDuringPresentation: true,
hidesNavigationBarDuringPresentation: true,
searchBarDelegate: ls,
searchBarFrame: CGRectMake(0.0, 0.0, SCREEN_WIDTH, 44.0),
searchBarStyle: .Minimal,
searchBarPlaceHolder: NSLocalizedString("Search a location...", comment: ""),
searchBarFont: nil,
searchBarTextColor: nil,
searchBarBarTintColor: UIColor.whiteColor(),
searchBarTintColor: iconsColor)
searchController.searchBar.keyboardAppearance = .Dark
definesPresentationContext = true
tableView.tableHeaderView = searchController.searchBar
- 1. UISearchController UISearchBar nicht zu Statusleiste erweitern
- 2. UISearchBar benutzerdefinierte
- 3. UISearchController mit UIBarPositionTopAttached wirft UISearchBar offscreen; Unmöglich, Standard UISearchController mit UITableView zu haben?
- 4. UISearchBar benutzerdefinierte Ecken
- 5. UISearchController UISearchBar kann nicht in navigationItem titleView bearbeitet werden
- 6. UISearchbar Abbrechen Button benutzerdefinierte Bild
- 7. UISearchBar überlappt mit UITableView Inhalt, wenn aktiv
- 8. Abbrechen Suche mit UISearchController führt zum Absturz
- 9. Wie kann ich eine Storyboard-UISearchBar mit einem programmgesteuerten UISearchController verbinden?
- 10. UISearchController funktioniert nicht ordnungsgemäß mit einer nicht-transluzenten UINavigationBar
- 11. Hinzufügen Filter Schaltfläche zu UISearchController
- 12. Scope von UISearchBar überlappt UITableViewCell
- 13. UISearchController Verwirrungen mit Layout der Zellen
- 14. UITableView unter UISearchBar auf MasterViewController (UISplitViewController)
- 15. UISearchBar implementiert mit Storyboards
- 16. UISearchController Absturz auf IndexPath
- 17. Kann ich einen UISearchController mit einem Storyboard verwenden?
- 18. UISearchController wird nicht angezeigt. iOS 9
- 19. UISearchBar wird beim Antippen der Ergebnistabelle gelöscht
- 20. UISearchBar von UISearchController in Tabellenkopfansicht dargestellt beseelt zu weit, wenn sie aktiv
- 21. ändern UISearchBar Löschtaste Text in iOS 8
- 22. UISearchBar-Funktionalität durch UITextField
- 23. Wie UISearchController nach didSelectRow zu entlassen?
- 24. UISearchController Suchleiste Position sinkt 64 Punkte
- 25. UISearchController der Suchleiste überlappt ersten Tableview Zelle
- 26. UISearchBar Animation
- 27. UISearchBar Beispielcode
- 28. Warum scheint die UISearchBar beim Navigieren zurück zu blinken?
- 29. Wie man UISearchBar einmal absetzen kann
- 30. UISearchController - Suchleiste verschwindet von Wrapper bei Berührung
Nichts darin verwendet einen Unterklasse UISearchController, die ich sehen kann – farski
Gab es Updates zu diesem Problem? Ich kämpfe mit dem gleichen. Ich benutze benutzerdefinierte 'UISearchBar' und' UISearchController', um zu vermeiden, dass die Abbrechen-Schaltfläche angezeigt wird. "UISearchResultsUpdating" wird jetzt nicht bei Änderungen des Suchtextes aufgerufen, und daher wird die Ergebnistabelle überhaupt nicht angezeigt. – artooras