cellForRowAtIndexPath:reloaddata 未调用

Posted

技术标签:

【中文标题】cellForRowAtIndexPath:reloaddata 未调用【英文标题】:cellForRowAtIndexPath: not called by reloaddata 【发布时间】:2015-07-19 17:11:13 【问题描述】:

我知道这是一个常见问题,但是当我使用 [actionTableView reloadData]; 时,没有调用 cellForRowAtIndexPath:。感谢情节提要,我已经链接了 dataSourcedelegate,但它并没有解决问题。

这是我的代码的一部分:

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 所在的视图控制器中的相同函数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];

注意:我可以在这里毫无问题地将一些数据从视图控制器传递给另一个。

【问题讨论】:

确保您的 tableView: numberOfRowsInSection 没有返回 0 numberOfSectionsInTableViewnumberOfRowsInSection 甚至都没有被调用 那么你的视图控制器没有监听 UITableViewDelegate,我不确定你是如何在 Storyboard 中连接它们的。但是如果你 100% 确定你做的一切都是正确的,如果它适合你的项目,你可以实现 awakeFromNib 方法,你把 actionTableView.delegate = self 是的,一切都很好。它也不适用于awakeFromNibnumberOfSectionsInTableViewnumberOfRowsInSection 仅在应用程序打开时调用一次,但此时数组为空。然后,当我使用 IBAction 将数据加载到 NSArray 中,然后处理 reloadData 时,它们不再被调用。 强制调用numberOfRowsInSectionarenumberOfSectionsInTableView你可以把你的重新加载数据放在[tableView beginUpdates]; [tableView reloadData]; [tableView endUpdates];中,如果你不删除/插入单元格,这不是必需的,但只是作为一种解决方法来了解什么是错了。 【参考方案1】:

在处理表格视图时我经常遇到的一件事是使用界面构建器将表格与界面连接起来。但是当你调用 [actionTableView reloadData] 而没有与表建立连接时,什么都不会发生。

我忘记了那个超级简单的步骤。希望这有帮助

【讨论】:

我至少验证了十次! actionTableView 出口,delegatedataSource 都与 IB 相连 该死!好的,你知道这些方法没有被调用,因为你说了一个断点?你怎么知道他们没有被召唤??? 很好,嗯,尝试以编程方式分配委托和数据源,就像在 viewDidAppear 中一样:然后在代码中调用 reloadData,以防故事板出现问题 它不能以编程方式与actionTableView.delegate = selfactionTableView.dataSource = self 一起工作。我真的不知道怎么了 我什么也没得到。我简要地查看了这个链接,但没有看到太大的区别,因为我只在 xib 上工作,在故事板上没有那么多。也许答案将是一个缺失的步骤? appcoda.com/uitableview-tutorial-storyboard-xcode5【参考方案2】:

问题是您永远不会将actionsArrayfilteredActionArray 初始化为非零。结果 numberOfRowsInSection 总是返回 0,所以 cellForRowAtIndexPath 不会被调用。

【讨论】:

在调用 reloadData actionsArray 之前加载了此处未显示的另一个函数。在重新加载数据之前,我检查了 NSArray 的内容,一切正常 这太奇怪了,所以 numberOfSectionsInTableView: 从来没有被调用过?您在函数头上放置了一个断点,什么也没有? Bc 任何将数据源附加到任何东西的表视图都会在加载视图时自动加载其数据,它应该至少调用这些函数一次【参考方案3】:

终于找到解决办法了!

在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

谢谢大家!

【讨论】:

所以你必须删除通知??

以上是关于cellForRowAtIndexPath:reloaddata 未调用的主要内容,如果未能解决你的问题,请参考以下文章

从 cellForRowAtIndexPath 中调用 heightForRowAtIndexPath?

cellForRowAtIndexPath:reloaddata 未调用

tableView:cellForRowAtIndexPath 的保留计数:

UITableView tableView:cellForRowAtIndexPath:没有被调用

nib 项目中的 CellForRowAtIndexPath

无法在 tableView:cellForRowAtIndexPath: 方法中设置标签框