如何将 UISearchBar 添加到同一 UIViewController 中的两个 TableView
Posted
技术标签:
【中文标题】如何将 UISearchBar 添加到同一 UIViewController 中的两个 TableView【英文标题】:How to add a UISearchBar to two TableView in the same UIViewController 【发布时间】:2013-04-10 22:52:30 【问题描述】:-
我正在使用 JASidePanel - https://github.com/gotosleep/JASidePanels 来创建菜单效果。
我正在使用 xib。
我的类扩展了 UIViewController。
searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText:
时不知道如何显示到另一个 tableView
您会看到第一个 tableView 是 Panel,过滤后的 tableView 是带有名称的 Thumb。
以下代码在需要添加第二个 tableview 时停止。
SidePanelViewController.h
@interface SidePanelViewController : UIViewController <UISearchBarDelegate, UISearchDisplayDelegate, UITableViewDataSource, UITableViewDelegate, MFMailComposeViewControllerDelegate, MFMessageComposeViewControllerDelegate>
IBOutlet UIImageView *_photoProfile;
IBOutlet UILabel *_nameLabel;
NSArray *_menuArray;
@property (nonatomic, readonly) IBOutlet UISearchBar *searchBar;
@property (nonatomic, strong) IBOutlet UITableView *tableView;
@property(nonatomic, strong) NSMutableArray *tableViewData;
@property(nonatomic, strong) NSMutableArray *originalTableViewData;
@property(nonatomic, strong) NSMutableArray *searchArray;
@property(nonatomic, strong) NSMutableDictionary *units;
SidePanelViewController.m
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
_menuArray = [[NSArray alloc]initWithObjects:@"Home",@"Meu QR Sem Hora", @"Favoritas", @"Minha Pontuação", @"Minha Conta",@"Convidar Amigos", @"Ajuda", @"Fale Conosco",@"Privacidade e Termos", nil];
_tableViewData = [[NSMutableArray alloc] initWithArray:_menuArray];
// Don't show the scope bar or cancel button until editing begins
[_searchBar setShowsScopeBar:NO];
[_searchBar sizeToFit];
//
// Create a header view. Wrap it in a container to allow us to position
// it better.
//
UIView *containerView =
[[UIView alloc]
initWithFrame:CGRectMake(0, 0, 320, 30)];
UILabel *headerLabel =
[[UILabel alloc]
initWithFrame:CGRectMake(0, 0, 320, 30)];
headerLabel.text = NSLocalizedString(@"Perfil", @"");
headerLabel.textColor = [UIColor blackColor];
headerLabel.shadowColor = [UIColor whiteColor];
headerLabel.shadowOffset = CGSizeMake(0, 1);
headerLabel.font = [UIFont boldSystemFontOfSize:22];
headerLabel.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
[containerView addSubview:headerLabel];
self.tableView.tableHeaderView = containerView;
//SetName and Picture
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
_nameLabel.text = [defaults valueForKey:@"name"];
_photoProfile.image = [UIImage imageWithData:[defaults objectForKey:@"Photo"]];
- (void)viewWillAppear:(BOOL)animated
[_tableView reloadData];
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
[self filterContentForSearchText:searchText];
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
[self.sidePanelController setCenterPanelHidden:YES animated:YES duration:0.2f];
- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar
[self.sidePanelController setCenterPanelHidden:NO animated:YES duration:0.2f];
searchBar.text = @"";
_tableViewData = [_originalTableViewData mutableCopy];
[_tableView reloadData];
[searchBar resignFirstResponder];
- (void) searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
[self.sidePanelController setCenterPanelHidden:NO animated:YES duration:0.2f];
#pragma mark - ScrollView (UITableView) delegate methods
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
[_searchBar resignFirstResponder];
[self performSelector:@selector(enableCancelButton:) withObject:self.searchBar afterDelay:0.0];
// Used to re-enabled the cancel button when a user starts scrolling
- (void)enableCancelButton:(UISearchBar *)aSearchBar
for (id subview in [aSearchBar subviews])
if ([subview isKindOfClass:[UIButton class]])
[subview setEnabled:TRUE];
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
- (void)filterContentForSearchText:(NSString *)searchText
if (searchText && searchText.length)
[_tableViewData removeAllObjects];
for (NSDictionary *dictionary in _originalTableViewData)
for (NSString *thisKey in [dictionary allKeys])
if ([thisKey isEqualToString:@"SearchKey1"] ||
[thisKey isEqualToString:@"SearchKey2"] )
if ([[dictionary valueForKey:thisKey] rangeOfString:searchText
options:NSCaseInsensitiveSearch].location != NSNotFound)
[_tableViewData addObject:dictionary];
// for (NSString *thisKey in allKeys)
// if ([thisKey isEqualToString:@"SearchKey1"] || ...
// for (NSString *thisKey in [dictionary allKeys])
// for (NSDictionary *dictionary in originalTableViewData)
[_tableView reloadData];
// if (query && query.length)
#pragma mark - UITableViewDelegate
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return _menuArray.count;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIndentifier = @"CustomMenu";
CustomMenuCell *cell = (CustomMenuCell *) [_tableView dequeueReusableCellWithIdentifier:cellIndentifier];
if(!cell)
cell = (CustomMenuCell *) [[[NSBundle mainBundle] loadNibNamed:@"CustomMenuView" owner:nil options:nil] objectAtIndex:0];
NSString *tempString = [_menuArray objectAtIndex:indexPath.row];
[cell configureMenu:tempString];
cell.selectionStyle = UITableViewCellSelectionStyleGray;
return cell;
【问题讨论】:
【参考方案1】:不知道你是否解决了这个问题,但你是什么意思显示到另一个表视图?如果您的意思是它显示的与您发布的第二张图片相似,那么我会继续说,如果您使用“搜索栏和搜索显示”,搜索栏应该已经有一个?
self.searchDisplayController.searchResultsTableView
如果您确实使用了该搜索栏和显示,您可以使用 NSPredicate 并创建一个过滤器可变数组,该数组复制并根据您的 originalTableViewData 进行谓词。 希望这对您或其他仍然感兴趣的人有所帮助。
【讨论】:
我已经完成了这项工作,需要做很多工作,问题是您需要更改表格视图,检查新的行数,填充新内容,创建过滤器,检查如果搜索是否可聚焦,请使“X”按钮清除视图。以上是关于如何将 UISearchBar 添加到同一 UIViewController 中的两个 TableView的主要内容,如果未能解决你的问题,请参考以下文章
将 UISearchBar 作为子视图添加到 tableView 标题中
以编程方式将 UISearchBar 添加到 UITableView 不起作用
使用 TableView 和刷新控件将按钮添加到 UISearchBar
将 UISearchBar 添加到嵌入到 NavigationController IOS6 中的 UICollectionviewController
以编程方式将 UISearchBar 添加到普通 ViewController 中以编程方式添加的 UITableView