我有一个由核心数据填充的UITableView
。现在,当我点击一个单元格时,它会将我推送到另一个视图,在那里我可以编辑该特定索引中的数据,当我返回时,系统崩溃或者不会将更改加载到标签上,任何想法?代码
-(void)viewWillAppear:(BOOL)animated
{
searchCriteria = [[NSMutableString alloc] initWithString:@"clientName"];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"clientName" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
[self.clientTableView reloadData];
[super viewWillAppear:animated];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
Client * client = [self.fetchedResultsController objectAtIndexPath:indexPath];
clientNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 250.00, 30.0)];
clientNameLabel.tag = 1;
clientNameLabel.backgroundColor = [UIColor clearColor];
clientNameLabel.textColor = [UIColor whiteColor];
clientNameLabel.font = [UIFont boldSystemFontOfSize:13];
clientNameLabel.text = client.clientName;
[cell.contentView addSubview:clientNameLabel];
clientAccountNumberLabel = [[UILabel alloc] initWithFrame:CGRectMake(15.0, 35.0, 250.00, 30.00)];
clientAccountNumberLabel.tag = 2;
clientAccountNumberLabel.textColor = [UIColor whiteColor];
clientAccountNumberLabel.backgroundColor = [UIColor clearColor];
clientAccountNumberLabel.font = [UIFont boldSystemFontOfSize:13];
clientAccountNumberLabel.text = client.clientAccountNumber;
[cell.contentView addSubview:clientAccountNumberLabel];
clientTelephoneNumberLabel = [[UILabel alloc] initWithFrame:CGRectMake(300.0, 0.0, 250, 30.00)];
clientTelephoneNumberLabel.tag = 3;
clientTelephoneNumberLabel.textColor = [UIColor whiteColor];
clientTelephoneNumberLabel.backgroundColor = [UIColor clearColor];
clientTelephoneNumberLabel.font = [UIFont boldSystemFontOfSize:13];
[cell.contentView addSubview:clientTelephoneNumberLabel];
addressLine1Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
addressLine1Label.tag = 4;
addressLine1Label.textColor = [UIColor whiteColor];
addressLine1Label.backgroundColor = [UIColor clearColor];
addressLine1Label.font = [UIFont boldSystemFontOfSize:13];
addressLine1Label.text = client.addressLine1;
[cell.contentView addSubview:addressLine1Label];
addressLine2Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
addressLine2Label.tag = 5;
addressLine2Label.textColor = [UIColor whiteColor];
addressLine2Label.backgroundColor = [UIColor clearColor];
addressLine2Label.text = client.addressLine2;
addressLine2Label.font = [UIFont boldSystemFontOfSize:13];
[cell.contentView addSubview:addressLine2Label];
addressLine3Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
addressLine3Label.tag = 6;
addressLine3Label.textColor = [UIColor whiteColor];
addressLine3Label.backgroundColor = [UIColor clearColor];
addressLine3Label.font = [UIFont boldSystemFontOfSize:13];
addressLine3Label.text = client.addressLine3;
[cell.contentView addSubview:addressLine3Label];
addressLine4Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
addressLine4Label.tag = 7;
addressLine4Label.textColor = [UIColor whiteColor];
addressLine4Label.backgroundColor = [UIColor clearColor];
addressLine4Label.font = [UIFont boldSystemFontOfSize:13];
addressLine4Label.text = client.addressLine4;
[cell.contentView addSubview:addressLine4Label];
return cell;
}
崩溃日志如下:
2012-06-23 17:08:05.541 iSalesForce[11773:15803] no object at index 1 in section at index 0
您可能会发现其他一些有用的代码:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [fetchedObjects count];
}
- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 70.0;
}
答案 0 :(得分:0)
问题很可能是你的fetchedResultsController已经过时了(你使用ARC吗?是fetchedResultsController是一个“strong
”属性吗?
或者可能只是你的fetchedResultsController没有对象而你坚持在“numberOfSectionsInTableView
”方法中只有一个对象,而不管“fetchedResultsController
”的真实内容。
尝试这个新的&改进功能:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
if(cell == nil)
{
// this should never happen, but just in case...
NSLog( @"cell is still - unexpectedly - nil" );
} else {
if(self.fetchedResultsController == nil)
{
NSLog( @"surprise, fetchedResultsController is nil" );
} else {
Client * client = nil;
@try {
client = [self.fetchedResultsController objectAtIndexPath:indexPath];
}
@catch (NSException * e) {
NSLog( @"exception thrown while trying to fetch something from fetchedResultsController - %@ %@", [e name], [e reason] );
}
@finally {
clientNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 250.00, 30.0)];
clientNameLabel.tag = 1;
clientNameLabel.backgroundColor = [UIColor clearColor];
clientNameLabel.textColor = [UIColor whiteColor];
clientNameLabel.font = [UIFont boldSystemFontOfSize:13];
clientNameLabel.text = client.clientName;
[cell.contentView addSubview:clientNameLabel];
clientAccountNumberLabel = [[UILabel alloc] initWithFrame:CGRectMake(15.0, 35.0, 250.00, 30.00)];
clientAccountNumberLabel.tag = 2;
clientAccountNumberLabel.textColor = [UIColor whiteColor];
clientAccountNumberLabel.backgroundColor = [UIColor clearColor];
clientAccountNumberLabel.font = [UIFont boldSystemFontOfSize:13];
clientAccountNumberLabel.text = client.clientAccountNumber;
[cell.contentView addSubview:clientAccountNumberLabel];
clientTelephoneNumberLabel = [[UILabel alloc] initWithFrame:CGRectMake(300.0, 0.0, 250, 30.00)];
clientTelephoneNumberLabel.tag = 3;
clientTelephoneNumberLabel.textColor = [UIColor whiteColor];
clientTelephoneNumberLabel.backgroundColor = [UIColor clearColor];
clientTelephoneNumberLabel.font = [UIFont boldSystemFontOfSize:13];
[cell.contentView addSubview:clientTelephoneNumberLabel];
addressLine1Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
addressLine1Label.tag = 4;
addressLine1Label.textColor = [UIColor whiteColor];
addressLine1Label.backgroundColor = [UIColor clearColor];
addressLine1Label.font = [UIFont boldSystemFontOfSize:13];
addressLine1Label.text = client.addressLine1;
[cell.contentView addSubview:addressLine1Label];
addressLine2Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
addressLine2Label.tag = 5;
addressLine2Label.textColor = [UIColor whiteColor];
addressLine2Label.backgroundColor = [UIColor clearColor];
addressLine2Label.text = client.addressLine2;
addressLine2Label.font = [UIFont boldSystemFontOfSize:13];
[cell.contentView addSubview:addressLine2Label];
addressLine3Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
addressLine3Label.tag = 6;
addressLine3Label.textColor = [UIColor whiteColor];
addressLine3Label.backgroundColor = [UIColor clearColor];
addressLine3Label.font = [UIFont boldSystemFontOfSize:13];
addressLine3Label.text = client.addressLine3;
[cell.contentView addSubview:addressLine3Label];
addressLine4Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
addressLine4Label.tag = 7;
addressLine4Label.textColor = [UIColor whiteColor];
addressLine4Label.backgroundColor = [UIColor clearColor];
addressLine4Label.font = [UIFont boldSystemFontOfSize:13];
addressLine4Label.text = client.addressLine4;
[cell.contentView addSubview:addressLine4Label];
}
Client * client = [self.fetchedResultsController objectAtIndexPath:indexPath];
}
}
return cell;
}
(我实际上没有测试过这个...但我确实为你准备了一些新的错误检查和异常处理)