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 不显示单元格内容的主要内容,如果未能解决你的问题,请参考以下文章

Excel中如何锁定部分单元格内容不被修改?

antDesign使用a-table时,设置某列的单元格内容不换行

在Swift中单击后修改tableview中的单元格内容

在单元格内显示整个表格视图

UITableView 单元格内容未正确显示

当在同一个单元格内单击按钮时,如何在自定义表格视图单元格内隐藏/显示特定视图