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
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