我知道这是一个常见问题,但是当我使用[actionTableView reloadData];
时,不会调用 cellForRowAtIndexPath:。由于故事板,我已经链接了 dataSource 和委托,但它没有解决问题。
以下是我的代码的一部分:
SearchViewController.h
#import <UIKit/UIKit.h>
@interface SearchViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UISearchDisplayDelegate>
@property (strong, nonatomic) IBOutlet UITableView *actionTableView;
@property (strong, nonatomic) IBOutlet UISearchBar *actionSearchBar;
@property (strong, nonatomic) NSMutableArray *actionsArray;
@property (strong, nonatomic) NSMutableArray *filteredActionArray;
@end
SearchViewController.m
#import "SearchViewController.h"
#import "Action.h"
@interface SearchViewController ()
@end
@implementation SearchViewController
@synthesize actionsArray, actionTableView, filteredActionArray, actionSearchBar;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.searchDisplayController.searchResultsTableView) {
return [filteredActionArray count];
} else {
return [actionsArray count];
}
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if ( cell == nil ) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSLog(@"Aloha");
// Create a new Action object
Action *a = nil;
if (tableView == self.searchDisplayController.searchResultsTableView) {
a = [filteredActionArray objectAtIndex:indexPath.row];
} else {
a = [actionsArray objectAtIndex:indexPath.row];
}
// Configure the cell
cell.textLabel.text = a.nomAction;
[cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
return cell;
}
-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
// Update the filtered array based on the search text and scope.
// Remove all objects from the filtered search array
[self.filteredActionArray removeAllObjects];
// Filter the array using NSPredicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.nomAction contains[c] %@",searchText];
filteredActionArray = [NSMutableArray arrayWithArray:[actionsArray filteredArrayUsingPredicate:predicate]];
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
// Tells the table data source to reload when text changes
[self filterContentForSearchText:searchString scope:
[[self.searchDisplayController.searchBar scopeButtonTitles]objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
// Return YES to cause the search result table view to be reloaded.
return YES;
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
// Tells the table data source to reload when scope bar selection changes
[self filterContentForSearchText:self.searchDisplayController.searchBar.text scope:
[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
// Return YES to cause the search result table view to be reloaded.
return YES;
}
如你所见,我也使用searchBar来过滤数组,但没有这个,它也不起作用。
编辑:问题规范: reloadData
只有在我在viewController中调用它时才有效。不是我从另一个viewController调用它。显然,对于这两种情况,我调用位于tableView所在的viewcontroller中的相同函数updatingTableView
。有什么想法从anotherViewController重新加载tableView吗?
SearchViewController.m (工作)
-(IBAction)update{
[self updatingTableView:nil];
}
-(void)updatingTableView:(NSData*)someData {
actionsArray = [NSArray arrayWithObjects:@"item1", @"item2", @"item3", nil];
[actionTableView reloadData];
}
AnotherViewController.m (不起作用)
-(IBAction)updateFromElsewhere{
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main"
bundle: nil];
SearchViewController *searchViewController = (SearchViewController*) [mainStoryboard
instantiateViewControllerWithIdentifier: @"searchcontroller_id"];
[searchViewController updatingTableView:nil];
}
注意:我可以将视图控制器中的一些数据传递给另一个,没有问题。
答案 0 :(得分:1)
在使用表格视图时,我总是遇到的一件事是使用界面构建器将表格与界面连接起来。但是当你在没有与表连接的情况下调用[actionTableView reloadData]时,什么都不会发生。
我忘了那个超级简单的步骤。希望这有帮助
答案 1 :(得分:0)
问题是你永远不会将/usr/local/lib/python2.7/dist-packages/Django-1.8.3-py2.7.egg/django/template
和/usr/local/lib/python2.7/dist-packages/Django-1.8.3-py2.7.egg/django/templatetags
初始化为非零。因此,numberOfRowsInSection始终返回0,因此不会调用cellForRowAtIndexPath。
答案 2 :(得分:0)
终于找到了解决方案!
在tableView所在的 SearchViewController.m 中,将其放在viewDidLoad
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updatingTableView) name:@"reload_data" object:nil];
还是:
-(void)updatingTableView{
[actionTableView reloadData];
}
在 AnotherViewController.m
中[[NSNotificationCenter defaultCenter] postNotificationName:@"reload_data" object:self];
how to reload tableview of another uiviewcontroller in current viewcontroller
谢谢大家!