Добавление Uisearchbar программно в UITableView
Я пытаюсь добавить UISearchBar
(с соответствующей логикой поиска), но есть проблема: я использую UITableViewController
подкласс автоматически генерируется UITableView
вместо отдельной nib
file, и манипулирование всем программно с точки зрения представления таблицы.
в Interface Builder есть возможность добавить Поиска и Поиск Контроллера Дисплея до nib
. Есть ли способ выполнить эту же задачу программно или в мою пользу отказаться от значения по умолчанию UITableView
и переход на пользовательский UITableView
nib файл, так что я могу легко добавить UISearchbar
?
кроме того, я попробовал тестирование, просто добавив строку поиска в мой UITableView
заголовок (где я хочу, чтобы он пошел) через следующий код в моем viewDidLoad
реализация, но она отображается за заголовком раздела таблицы и, следовательно, невидима, если таблица не прокручивается вниз, чтобы показать, что в противном случае было бы пробелом. Любая идея, что с этим?
UISearchBar *testbar = [[UISearchBar alloc] init];
[[self tableView] setTableHeaderView:testbar];
4 ответов
установите рамку для UISearchBar:
// Change the position according to your requirements
self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 70, 320, 44)];
если ваш взгляд является подклассом UITableViewController
меняем на UIViewController
.
в вашем файле nib создайте представление и перетащите tableView под это просмотрите и измените ссылочный класс для этого представления на свой
UIViewController
.создать
IBOutlet
ofUITableView * myTableView
и подключить его к ваш файл nib. вам просто нужно изменить в своем файле VC, например, self на[self.myTableView reloadData];
теперь вы можете настроить tableView
и панель поиска в самом наконечнике.
UISearchDisplay
контроллер имеет свой собственный UITableView
отображает результаты поиска данных, управляемых другим контроллером представления. Здесь searchDisplaycontroller
объединяет панель поиска и tableview, чтобы показать данные результата в tableview, поэтому для этого не потребуется отдельный tableview.
чтобы добавить UISearchBar в UITableView, есть следующие вещи:
- объявить и инициализировать UISearchBar
- объявить и инициализировать UISearchDisplayController
- добавьте панель поиска в tableView
- реализовать делегат UISearchDisplayController
- в заголовочном файле я объявляю свою панель поиска, searchDisplayController и массивы, содержащие данные для дисплей.
ViewController.h:
#import
@interface ViewController : UITableViewController
{
NSArray *originalData;
NSMutableArray *searchData;
UISearchBar *searchBar;
UISearchDisplayController *searchDisplayController;
}
@end
Я также добавил 2 делегата в класс: UISearchBarDelegate и UISearchDisplayDelegate, без, панель поиска просто не работает!
инициализация данных:
//ViewController.m
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
NSArray *group1 = [[NSArray alloc] initWithObjects:@"Napoli", @"Juventus", @"Inter", @"Milan", @"Lazio", nil];
NSArray *group2 = [[NSArray alloc] initWithObjects:@"Real Madrid", @"Barcelona", @"Villareal", @"Valencia", @"Deportivo", nil];
NSArray *group3 = [[NSArray alloc] initWithObjects:@"Manchester City", @"Manchester United", @"Chelsea", @"Arsenal", @"Liverpool", nil];
originalData = [[NSArray alloc] initWithObjects:group1, group2, group3, nil];
searchData = [[NSMutableArray alloc] init];
}
return self;
}
теперь нам нужно инициализировать наши два объекта, Я прокомментировал код, чтобы объяснить, что я делаю:
//ViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
/*the search bar widht must be > 1, the height must be at least 44
(the real size of the search bar)*/
searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
/*contents controller is the UITableViewController, this let you to reuse
the same TableViewController Delegate method used for the main table.*/
searchDisplayController.delegate = self;
searchDisplayController.searchResultsDataSource = self;
//set the delegate = self. Previously declared in ViewController.h
self.tableView.tableHeaderView = searchBar; //this line add the searchBar
//on the top of tableView.
}
я решил пропустить часть об инициализации ячейки tableView, вы можете найти ее в загружаемом источнике код. :)
когда tableView готов, пришло время реализовать UISearchDisplayControllerDelegate!
делегат имеет много методов для управления каждым аспектом поиска, но наиболее важным является
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
этот метод вызывается каждый раз, когда вы вставляете новый символ в строке поиска, вы берете строку поиска, выполняете поиск по элементам таблицы и возвращаете YES.
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[searchData removeAllObjects];
/*before starting the search is necessary to remove all elements from the
array that will contain found items */
NSArray *group;
/* in this loop I search through every element (group) (see the code on top) in
the "originalData" array, if the string match, the element will be added in a
new array called newGroup. Then, if newGroup has 1 or more elements, it will be
added in the "searchData" array. shortly, I recreated the structure of the
original array "originalData". */
for(group in originalData) //take the n group (eg. group1, group2, group3)
//in the original data
{
NSMutableArray *newGroup = [[NSMutableArray alloc] init];
NSString *element;
for(element in group) //take the n element in the group
{ //(eg. @"Napoli, @"Milan" etc.)
NSRange range = [element rangeOfString:searchString
options:NSCaseInsensitiveSearch];
if (range.length > 0) { //if the substring match
[newGroup addObject:element]; //add the element to group
}
}
if ([newGroup count] > 0) {
[searchData addObject:newGroup];
}
[newGroup release];
}
return YES;
}
вот и все! Этот метод будет выполнять полнотекстовый поиск во всех элементах. Когда поиск заканчивается, tableView перезагружается. См. исходный код, чтобы увидеть другие подробности.
реализовать - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
. Это решит проблему метки раздела, покрывающей headerView
в swift:
let searchController = UISearchController(searchResultsController: nil)
let topConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 40)
let leftConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: 0)
let rightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 0)
let heightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 44)
searchController.searchBar.translatesAutoresizingMaskIntoConstraints = false
searchController.searchBar.addConstraint(heightConstraint)
searchController.searchBar.placeholder = "Search Here"
searchController.searchResultsUpdater = self
searchController.searchBar.delegate = self
self.view.addSubview(searchController.searchBar)
self.view.addConstraints([topConstraint, leftConstraint, rightConstraint])
добавить делегат:
class ViewController: UIViewController, UISearchBarDelegate
Теперь добавьте метод делегата для перезагрузки представления таблицы:
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
//add your custome code here after search a string
tableView.reloadData()
}
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
//add your custome code here after finishing search
tableView.reloadData()
}