rip*_*pel 2 iphone refresh uitableview
我已经阅读了很多关于UITableViews的主题没有在iPhone上刷新,但找不到符合我情况的任何内容,所以我正在寻求帮助.
在我的类中,它扩展了UIViewController,我有一个TableView和一个'ElementList'(它是NSMutableArray的包装器)用作数据源.
一个单独的线程通过'updateList:'方法向数组添加一个新元素.发生这种情况时,我希望自动刷新tableView,但这不会发生.
通过调试我的应用程序,我可以看到'cellForRowAtIndexPath'永远不会被调用,我无法找出原因.
我试图添加一个Observer,它调用'reloadTableView'方法(它实际上被调用),但tableView没有更新.
这是我的代码:
#import <UIKit/UIKit.h>
@interface ListViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
{
UITableView *tableView;
ElementList *elementList; // Wrapper for NSMutableArray
}
// Called by someone else, triggers the whole thing
-(void)updateList:(Element *)element;
// Added out of desperation
-(void)reloadTableView;
@end
@implementation ListViewController
-(void)loadView
{
// Create the TableView
tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStylePlain];
assert(tableView != nil);
tableView.delegate = self;
tableView.dataSource = self;
[tableView reloadData];
self.view = tableView;
// Added out of desperation
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadTableView) name:@"UpdatedListNotification" object:nil];
}
-(void)reloadTableView
{
// Try anything
[tableView reloadData];
[tableView setNeedsLayout];
[tableView setNeedsDisplay];
[tableView reloadData];
[self.view setNeedsLayout];
[self.view setNeedsDisplay];
}
// Called by someone else, triggers the whole thing
-(void)updateList:(Element *)element
{
assert(element != nil);
[elementList addElement:element];
[element release];
// Notify the observer, which should update its table view
[[NSNotificationCenter defaultCenter] postNotificationName:@"UpdatedListNotification" object:self];
}
// TableView Delegate protocol
- (void)tableView:(UITableView *)table didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Element *selected_element = [elementList getElementAtIndex:indexPath.row];
if (selected_element == nil)
{
NSLog(@"ERROR: Selected an invalid element");
return;
}
[table deselectRowAtIndexPath:indexPath animated:YES];
NSLog(@"Selected %@", selected_element.name);
}
// TableView Data Source protocol
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [elementList count];
}
- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [table dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Set the cell label
cell.textLabel.text = [[elementList getElementAtIndex:indexPath.row] name];
cell.textLabel.frame = cell.bounds;
cell.textLabel.textAlignment = UITextAlignmentLeft;
return cell;
}
@end
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助,谢谢.
Phi*_*ert 13
通知在与调用者相同的线程中执行.更新UI应该在主线程中完成,所以你应该在主线程上调用-reloadData:
-(void)updateList:(Element *)element
{
assert(element != nil);
[elementList addElement:element];
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil];
}
Run Code Online (Sandbox Code Playgroud)
另请注意,您不应释放您不拥有的对象.所以不要在-updateList方法中调用[element release].该函数的调用者应该调用该版本.
| 归档时间: |
|
| 查看次数: |
9326 次 |
| 最近记录: |