TableView 不显示单元格内容
Posted
技术标签:
【中文标题】TableView 不显示单元格内容【英文标题】:TableView not displaying Cell Content 【发布时间】:2015-04-07 09:57:12 【问题描述】:我正在使用core data
作为我的数据库。在我的UITableView
里面有一个添加项目的按钮,但此时我只用它来添加名称。但是我添加的名称不会显示在 tableview 上。
我认为我的问题是我需要重新填充我的 projectArray,我该如何以及在哪里这样做。
这是我的代码:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [_projectArray count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Project* project = _projectArray[indexPath.row];
static NSString *cellID = @"TableCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];
cell.textLabel.text = project.name;
cell.detailTextLabel.text = @"prooo";
self.tableView.delegate = self;
self.tableView.dataSource = self;
return cell;
这是我的按钮代码:
- (IBAction)addProjectButton:(id)sender
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Enter new project name."
message:nil
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Ok", nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];
UITextField *textField = [alert textFieldAtIndex:0];
textField.placeholder = @"Project Name";
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
if (buttonIndex != alertView.cancelButtonIndex)
UITextField *field = [alertView textFieldAtIndex:0];
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [delegate managedObjectContext];
NSManagedObject *object =[NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:context];
[object setValue:field.text forKey:@"name"];
NSError *error;
[context save:&error];
if (![context save:&error])
NSLog(@"Whoops %@ %@", error, [error localizedDescription]);
[self.tableView reloadData];
else
NSLog(@"cancel");
这是我的 ViewWillAppear 代码,我从中获取信息:
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:nil];
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [delegate managedObjectContext];
//load project
NSFetchRequest *fetch = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:context];
[fetch setEntity:entity];
NSError *error;
_projectArray = [context executeFetchRequest:fetch error:&error];
【问题讨论】:
tableView的datasource和delegate在哪里设置? 你也应该从获取请求中评估错误对象。 【参考方案1】:您可以做很多事情。为了使它成为一个好的代码,我建议编写一个重新加载数组的方法。像这样
-(void) reloadArray
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [delegate managedObjectContext];
//load project
NSFetchRequest *fetch = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:context];
[fetch setEntity:entity];
NSError *error;
_projectArray = [context executeFetchRequest:fetch error:&error];
然后像这样替换您的 viewDidAppear -
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:nil];
[self reloadArray];
同样在您的 numberOfSectionsInTableView: 方法中,进行此更改 -
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
[self reloadArray];
return 1;
它应该会变魔术......
【讨论】:
【参考方案2】:你设置好tableView的dataSource和delegate属性了吗?
self.tableView.delegate = self;
self.tableView.dataSource = self;
【讨论】:
是的,但对结果没有影响【参考方案3】:改变这个:
NSFetchRequest *fetch = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:context];
[fetch setEntity:entity];
NSError *error;
_projectArray = [context executeFetchRequest:fetch error:&error];
收件人:
_projectArray = [[NSMutableArray alloc]init];
NSFetchRequest *fetch = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:context];
[fetch setEntity:entity];
NSManagedObject *object = nil;
NSError *error;
NSArray *result = [context executeFetchRequest:fetch error:&error];
for (int i = 0; i < [result count]; i ++)
object = [result objectAtIndex:i];
[_projectArray setObject:[object valueForKey:@"name"]
【讨论】:
声明setObject的数组没有接口 声明你的数组为 NSMtableArray 并初始化它 好的,我已经把它改成了一个可变数组,你能帮我吗? @LenvanZyl 如果您的数组为空,它将不会转到tableview datasource
代码。所以首先你必须确保你的数组被正确填充。
尝试在您的项目数组中包含一些硬编码数据,然后查看.. 如果您的数据被加载,这意味着您没有从核心数据中正确获取数据以上是关于TableView 不显示单元格内容的主要内容,如果未能解决你的问题,请参考以下文章