【问题标题】:TableView not displaying Cell ContentTableView 不显示单元格内容
【发布时间】: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在哪里设置?
  • 你也应该从获取请求中评估错误对象。

标签: ios objective-c arrays uitableview core-data


【解决方案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 代码。所以首先你必须确保你的数组被正确填充。
    • 尝试在您的项目数组中包含一些硬编码数据,然后查看.. 如果您的数据被加载,这意味着您没有从核心数据中正确获取数据
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多