2014-09-18 24 views
8

UISearchController belgeleri, denetleyicinin kullanması için UISearchBar özel bir alt sınıf sağlamak üzere - searchBar geçersiz kılabileceğinizi belirtir. Özel arama çubuğu kullanılır ve kendi delege yöntemleri doğru çağrılır, ancak arama çubuğu değiştiğinde UISearchResultsUpdating yöntemi artık çağrılmaz. El ile birçok kablolama işlemi yapmam gerekiyor mu, yoksa denetleyicinin doğal olarak sağlanan bir arama çubuğunda olduğu gibi davranmasını sağlamak için eksik bir şey var mı?UISearchController ile Özel UISearchBar

+0

Hiçbir şey orada göremediğim alt sınıf UISearchController kullanmıyor – farski

+0

Bu sorun hakkında herhangi bir güncelleştirme oldu mu? Ben aynı şekilde mücadele ediyorum. İptal düğmesine basmaktan kaçınmak için özel 'UISearchBar' ve 'UISearchController' kullandım. Artık, "UISearchResultsUpdating", arama metni değişikliklerine çağrılmıyor ve bu nedenle sonuç tablosu hiç gösterilmiyor. – artooras

cevap

3

Bu bilinen bir hatadır. Maalesef, özel API'yi içermeyen bir geçici çözüm bulunmamaktadır.

+0

Bunu detaylandırır mısınız? Bilinen bir hata olarak bu sorunun herhangi bir sözünü bulamıyorum. – pbuchheit

+0

@Alex UISearchController yalnızca iOS 8 ve üzerinde kullanılabilir. Derleyici, sınıfı iOS 7 ve altında tanımayacaktır. Yalnızca iOS 8 ve üzerini destekleyene kadar UISearchDisplayController ile sabitleyin. –

+0

@MyztikJenz, bu hata ile ilgili herhangi bir değişiklik olup olmadığını biliyor musunuz? Benim sorunum, arama sonuçları tablosunun tamamen gösterilmemesidir çünkü 'UISearchResultsUpdating' özel bir 'UISearchBar' ile arama metni değişikliklerine çağrılmamaktadır. – artooras

0

Sanırım böyle davranması gerekiyordu.

Bu

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; 

dan Tüm bu temsilci yöntemi (updateSearchResultsForSearchController :) onun arama çubuğunu erişebilmesi için arama denetleyicisi dönmek etmez.

Bunu yalnızca özel arama çubuğu temsilci yöntemleriniz aracılığıyla yapabilirsiniz.

2

UISearchController alt sınıfını seçtiğinizde, UISearchBar'ı getterde özelleştirebilirsiniz (ayarlayıcı mevcut değil).

Örnek - alt sınıf uygulanmasında: Bu kimse yardımcı

-(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; 
} 

Umut. Özel UISearchController sınıfında SearchBar alıcı, bu özel Searchbar dönmek zorunda ve var

+0

Yine de bana çok yardımcı oldu. –

3

geçersiz kıl zaten, o zaman kurulum özellikleri yalnızca UISearchController init sonra, bu şekilde tüm UISearchController işlevselliği korunur başlatılması için:

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) 

    } 
} 

Ve bu benim özel searchbar geçerli:

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 örnek:

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 
İlgili konular