iOS - pushViewController:动画:没有正确推送表格视图吗?

时间:2016-05-27 15:44:29

标签: ios objective-c uitableview uiviewcontroller

我有一个UITabBarController和一个HomeTabController

我想要做的是在点击视图上的按钮时按UITableViewController

但是,确实显示了一个动画但没有显示表视图。

为了更清楚,我在这里有两个截图。

enter image description here

enter image description here

我的代码的一部分

@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

可能是什么问题?

控制台中没有错误消息?

1 个答案:

答案 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,请在初始化后设置视图框架,然后进入导航堆栈。

希望得到这个帮助。