【问题标题】:uitableview reloadData issueuitableview reloadData 问题
【发布时间】:2011-02-03 02:24:10
【问题描述】:

我一直在调试我的 iphone 应用程序并发现了一些有趣的东西。

我有一个带有 TabBarcontroller(6 个标签)的 UIViewControllers。每个选项卡都是一个 UIViewController,它有一个 UITtableview。 viewDidLoad 工作并带来初始数据。 UITableView 上有一个搜索栏。在用户触摸按下搜索后,会发生一些神奇的事情,我得到一个包含数据的数组。我在 tableview 中看不到新数据,并且 [tableView reloadData] 在 vi​​ewDidLoad 之外没有效果(第一次)。

我可以看到保存数据的数组,并且 dataSource 设置为 self。然而,没有显示数据!

所以我尝试了 [self.tableView reloadData] 和 [self.tableView setNeedsDisplay]

有趣的是,没有显示新数据。但是,如果我向上或向下移动表格,则会触发 cellForRowAtIndexPath 并且第一行显示数据。

谁能解开这个谜团???

如果有 [self.view refreshscreen] ??

-(void) viewWillAppear:(BOOL)animated{
    [self.tableView reloadData];
    [super viewWillAppear:animated];    
}

- (void) searchBarSearchButtonClicked:(UISearchBar *)searchBar2 {   
    [self searchForFullNames];
        //NSAssert(tableView, @"Whoops, tableView is Null");
    [tableView reloadData];
        // hide keyboard
    [searchBar2 resignFirstResponder];
}
- (void)viewDidLoad {

    NSString *path = [[NSBundle mainBundle] pathForResource:@"search" ofType:@"plist"];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path];  
    self.names = dict;
    [dict release];
    NSArray *array = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
    self.keys = array;
    isSearchOn = NO;
    canSelectRow = NO;

    self.tableView.scrollEnabled = NO;

    [super viewDidLoad];
}



- (void) searchForFullNames {

    self.listData = nil;
    self.names = nil;
    self.keys = nil;

    NSMutableDictionary *dict = [[NSMutableDictionary alloc]  init];
    NSMutableArray *person = [[NSMutableArray alloc] init];

    [person addObject:@"Doe, John"];
    [person addObject:@"11234"];    
    [person addObject:@"11/22/75"]; 

    [dict setObject:person forKey:@"Person 1"];

    person = [[NSMutableArray alloc] init];

    [person addObject:@"Doe, Mary"];
    [person addObject:@"4321"]; 
    [person addObject:@"11/22/85"]; 

    [dict setObject:person forKey:@"Person 2"];

    person = [[NSMutableArray alloc] init];

    [person addObject:@"Doe, John"];
    [person addObject:@"336655"];   
    [person addObject:@"10/22/84"]; 

    [dict setObject:person forKey:@"Person 3"];

    self.names = dict;

    [dict release];
        NSArray *array = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
    self.keys = array;

    isSearchOn = NO;
    canSelectRow = YES;

}

【问题讨论】:

  • 通常,当您调用超级方法时,您将该调用放在您要覆盖的方法的开头(dealloc 是一个值得注意的例外)。在执行自己的设置之前调用 [super viewDidLoad];否则你可能会无意中破坏你自己的设置。 viewWillAppear 的实现也是如此。
  • 您如何发布 [self searchForFullNames] 的代码?
  • 对此感到抱歉.. 我一直忘记添加代码! :) 问题是搜索似乎是为内存中的数据设计的。鉴于在搜索栏中输入的数据,我想从 Web 服务中检索数据并在删除当前内存中的先前数据后填充表格视图..

标签: iphone uiviewcontroller uitableview uisearchbar tableview


【解决方案1】:

UISearchDisplayController 有自己的 tableView 属性,称为 searchResultsTableView。如果您使用的是 searchDisplayController,请尝试使用:

[searchDisplayController.searchResultsTableView reloadData];

【讨论】:

  • 我没有使用 searchDisplayCONtroller 但谢谢!!!我在所有 FileOwner 下都看到了它,但从未使用过。你知道我在哪里可以找到一些示例代码来实现它吗?谢谢!!!
  • 这可能对他没有帮助,但它确实帮助我解决了我的问题! +1 美化黑客!
  • 太棒了。我遇到了一个问题,即搜索结果集在旋转后没有正确更新。在“didRotateFromInterfaceOrientation”中调用此委托方法后问题已解决。 +1 @glorifiedHacker。
  • MLReceptionListTable.m:209:17: Unknown receiver 'searchDisplayController'; did you mean 'UISearchDisplayController'? 但它构建错误。
【解决方案2】:

如果您没有在表格视图上调用 reloadData,您所描述的行为(新数据直到滚动才会显示)正是我所期望的。我会设置几个断点,并确保在右侧 UITableView 上确实调用了 reloadData,并且由于 reloadData 调用了 cellForRowAtIndexPath。

一个猜测是您的 self.tableView IBOutlet 没有连接,并且 self.tableView 为 NULL。 tableview Delegate 和 Datasource 有可能是连线的,而不是 tableView 本身。

【讨论】:

  • 你可以做一个 NSAsset(self.tableView,@"哎呀,tableview 是空的");在 [self.tableView reloadData] 之前;测试tableView插座没有接线的理论。
  • Brad, *** 断言失败 -[SearchView searchBarSearchButtonClicked:], SearchView.m:234 *** WebKit 丢弃了 webView 中未捕获的异常:shouldInsertText:replacingDOMRange:givenAction: delegate: 糟糕,tableView 为 Null 不确定这是我期望看到的,但看起来 NSAssert 失败了.. 对吗?和 tableView 是空的??
【解决方案3】:
[self.searchDisplayController.searchResultsTableView reloadData];

【讨论】:

    【解决方案4】:

    viewDidLoad 仅在加载视图控制器时被调用一次。您可能希望在每次显示视图时更新表格(例如,当您切换选项卡时),请将您的 reloadData 调用放在 viewWillAppear 中。

    【讨论】:

    • viewWIllAppear 只被调用一次。当我点击标签栏并切换标签时,它永远不会被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多