我有一个UITabBarController
和一个HomeTabController
。
我想要做的是在点击视图上的按钮时按UITableViewController
。
但是,确实显示了一个动画但没有显示表视图。
为了更清楚,我在这里有两个截图。
@implementation HomeTabController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.navigationItem.leftBarButtonItem = nil;
self.title = @"SCUxCHG";
UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Search"
style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.rightBarButtonItem = rightButton;
self.navigationItem.rightBarButtonItem.target = self;
self.navigationItem.rightBarButtonItem.action = @selector(didClickSearchBtn:);
[self.navigationController setNavigationBarHidden:NO];
_cMainSearchTableViewController = [[HomeTabSearchTableViewController alloc] init];
[self addChildViewController:_cMainSearchTableViewController];
-(IBAction)didClickSearchBtn:(id)sender
{
[self.navigationController setNavigationBarHidden:YES animated:YES];
[self.navigationController pushViewController:_cMainSearchTableViewController animated:YES];
}
@end
MainSearchTableViewController.m
@interface HomeTabSearchTableViewController (){
UISearchController* _cSearchController;
UITableViewController* _cSearchResultTableViewController;
NSArray* _allProductsIdsAndNamesPairs;
NSMutableArray* _filteredProducts;
}
@end
@implementation HomeTabSearchTableViewController
-(void)viewDidLoad{
[super viewDidLoad];
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_cSearchController = [[UISearchController alloc] initWithSearchResultsController:_cSearchResultTableViewController];
[self addChildViewController:_cSearchController];
[_cSearchController.searchBar sizeToFit];
self.tableView.tableHeaderView = _cSearchController.searchBar;
[_cSearchController.searchBar setShowsCancelButton:YES];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.view);
make.top.equalTo(self.view);
make.width.mas_equalTo(self.view);
make.height.equalTo(self.view);
}];
_cSearchResultTableViewController.tableView.delegate = self;
_cSearchResultTableViewController.tableView.dataSource = self;
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self getData];
}
- (void)getData{
[ProductModel getAllProductsIdsAndNamesDictionarySuccess:^(BOOL result, NSString* message, NSArray* allProductsIdsAndNamesPaires){
if (!result) {
_allProductsIdsAndNamesPairs = allProductsIdsAndNamesPaires;
NSLog(@"%@", _allProductsIdsAndNamesPairs);
[self.tableView reloadData];
}else{
NSLog(@"%@", message);
}
}failure:^(NSError* error){
}];
}
#pragma mark - UITableViewDataSource
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 2;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (section == 0) {
return 1;
}else{
if (!_cSearchController.active) {
return 0;
}else{
return _filteredProducts.count;
}
}
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
NSString* identifier = @"HomeTabMainSearchTableView";
UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
if (indexPath.section == 0) {
cell.textLabel.text = [NSString stringWithFormat:@"搜索 %@", _cSearchController.searchBar.text];
}else{
cell.textLabel.text = [_filteredProducts objectAtIndex:indexPath.row];
}
return cell;
}
#pragma mark - UISearchResultUpdating
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController{
[_filteredProducts removeAllObjects];
NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", _cSearchController.searchBar.text];
_filteredProducts = [[_allProductsIdsAndNamesPairs filteredArrayUsingPredicate:searchPredicate] mutableCopy];
dispatch_async(dispatch_get_main_queue(), ^{
[_cSearchResultTableViewController.tableView reloadData];
});
}
@end
您可以从代码中看到我使用UISearchController
实施UITableView
。
可能是什么问题?
控制台中没有错误消息?
答案 0 :(得分:0)
主要问题是您将表视图vc添加为子视图控制器,然后将其推入导航控制器。这是错的。尝试删除
[self addChildViewController:_cMainSearchTableViewController];
来自viewDidLoad
方法。
另外,尝试从xib或storyboard加载tableView,而不是[[alloc] init]。从现有代码 - 你推零帧的vc。
例如(对于xib):
HomeTabSearchTableViewController *vc = [[HomeTabSearchTableViewController alloc] initWithNibName:NSStringFromClass([HomeTabSearchTableViewController class]) bundle:nil];
for storyboard:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"View controller storyboard id"];
更新:
如果您不使用storyboard或xib,请在初始化后设置视图框架,然后进入导航堆栈。
希望得到这个帮助。