价值观传递给另一个视图控制器
我使用的核心数据有一个比较复杂的应用程序时,从管理对象消失,即除了在数据似乎消失了一个实例运作良好。我有一个托管对象类,pitLayer,有10个属性(字符串和数字),一个视图控制器(viewLayers),显示属于父对象的所有pitLayer对象,和一个视图控制器(editLayer)可以编辑(和创建)新的坑层对象。价值观传递给另一个视图控制器
当我创建一个新的pitLayer,然后返回到表视图,所有的属性表中正确显示。如果我立即回到editLayer,所有的值都显示正确。
如果我然后用editLayer编辑另一个pitLayer,除了2,硬度和botttomHardness(两个字符串)之外,我都可以得到正确的值,我仍然可以从前一个编辑好的pitLayer中获取值。
如果我加载editLayer首次与现有pitLayer硬度和bottomHardness返回零,所有其他值返回先前存储的值。
值越来越保存得当,它们可以在viewLayers中获取并返回正确的值,但是当他们在editLayer被取他们不返回正确的值。它只有2个属性,其他8个似乎工作得很好。
任何有关调试的建议?
这里是他们得到设置:
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ if(component == kGrainTypeComponent){ layer.grainType = [[grainTypeValues objectAtIndex:row] valueForKey:@"code"]; }else if(component == kSecondGrainTypeComponent){ layer.secondGrainType = [[grainTypeValues objectAtIndex:row] valueForKey:@"code"]; } else if(component == kHardnessComponent){ layer.hardness = [[hardnessValues objectAtIndex:row] valueForKey:@"code"]; } else if(component == kSecondHardnessComponent){ layer.bottomHardness = [[hardnessValues objectAtIndex:row] valueForKey:@"code"]; } [self checkSavable]; }
而这里就是他们未能让后来检索:
-(void)resetDefaults{
if(edit == YES && layer != nil){//Edit an existing layer
if(layer.comments)
comments.text = layer.comments;
else
comments.text = @"";
if(layer.thickness){
thicknessSlider.value = [layer.thickness floatValue];
[self thicknessChanged];
}
if(layer.grainSize){
grainSizeSlider.value = [layer.grainSize floatValue];
[self grainSizeChanged];
}else{
grainSizeSlider.value = 0;
grainSizeLabel.text = @"";
}
if(layer.density){
densitySlider.value = [layer.density floatValue];
[self densityChanged];
}else{
densitySlider.value = 0;
densityLabel.text = @"";
}
NSString *type = layer.grainType;
NSString *secondType = layer.secondGrainType;
NSString *hardness = nil;
hardness = layer.hardness;
NSString *bottomHardness = nil;
bottomHardness = layer.bottomHardness;
NSString *lwc = layer.liquidWaterContent;
NSUInteger typeIndex = 0;
NSUInteger secondTypeIndex = 0;
NSUInteger hardnessIndex = 0;
NSUInteger bottomHardnessIndex = 0;
NSLog(@"type:%@, hardness: %@, bottom hardness: %@", type, hardness, bottomHardness);
if(type){
for(int i = 0; i < [grainTypeValues count]; i++){
if([[[grainTypeValues objectAtIndex:i] valueForKey:@"code"] isEqualToString: type]){
typeIndex = i;
break;
}
}
}
[picker selectRow:typeIndex inComponent:kGrainTypeComponent animated:NO];
if(secondType){
for(int i = 0; i < [grainTypeValues count]; i++){
if([[[grainTypeValues objectAtIndex:i] valueForKey:@"code"] isEqualToString:secondType]){
secondTypeIndex = i;
break;
}
}
}
[picker selectRow:secondTypeIndex inComponent:kSecondGrainTypeComponent animated:NO];
if(hardness){
for(int i = 0; i < [hardnessValues count]; i++){
if([[[hardnessValues objectAtIndex:i] valueForKey:@"code"] isEqualToString:hardness]){
hardnessIndex = i;
break;
}
}
}
[picker selectRow:hardnessIndex inComponent:kHardnessComponent animated:NO];
if(bottomHardness){
for(int i = 0; i < [hardnessValues count]; i++){
if([[[hardnessValues objectAtIndex:i] valueForKey:@"code"] isEqualToString:bottomHardness]){
bottomHardnessIndex = i;
break;
}
}
}
if(secondHardness)
[picker selectRow:bottomHardnessIndex inComponent:kSecondHardnessComponent animated:NO];
if(lwc){
for(int i = 0; i < [lwcValues count]; i++){
if([[[lwcValues objectAtIndex:i] valueForKey:@"code"] isEqualToString:lwc]){
lwcSlider.value = [[[lwcValues objectAtIndex:i] valueForKey:@"value"] floatValue];
lwcLabel.text = [[lwcValues objectAtIndex:i] valueForKey:@"name"];
break;
}
}
}else{
lwcSlider.value = 0;
lwcLabel.text = @"";
}
if(layer.formationDate){
datePicker.date = layer.formationDate;
[self dateChanged];
}else{
formationDate.text = @"";
datePicker.date = [NSDate date];
}
}else{//create a new layer
comments.text = @"";
thicknessSlider.value = 0;
thicknessLabel.text = @"0.0";
grainSizeSlider.value = 0;
grainSizeLabel.text = @"";
densityLabel.text = @"";
densitySlider.value = 0;
lwcLabel.text = @"";
lwcSlider.value = 0;
formationDate.text = @"";
datePicker.date = [NSDate date];
[picker selectRow:0 inComponent:kGrainTypeComponent animated:NO];
[picker selectRow:0 inComponent:kSecondGrainTypeComponent animated:NO];
[picker selectRow:0 inComponent:kHardnessComponent animated:NO];
if(secondHardness)
[picker selectRow:0 inComponent:kSecondHardnessComponent animated:NO];
}
thicknessUnitLabel.text = layer.parentPit.depthUnit;
locationUnitLabel.text = layer.parentPit.depthUnit;
densityUnitLabel.text = layer.parentPit.densityUnit;
if([layer.parentPit.densityUnit isEqualToString:@"kg/m3"]){
densitySlider.maximumValue = 1000;
densitySliderDecimalCutoff = 0;
}else{
densitySlider.maximumValue = 100;
densitySliderDecimalCutoff = 20;
}
topLabel.text = [NSString stringWithFormat:@"%1.1F", [[layer topLocation] floatValue]];
bottomLabel.text = [NSString stringWithFormat:@"%1.1F", [[layer bottomLocation] floatValue]];
}
的值获得存储正确的,他们可以在 viewlayer中取回并返回co正确的值...
这表明值正在进入托管对象并保存到持久存储区。
...但是,当它们在editLayer中被提取时,它们不会返回正确的 值。
对此的唯一解释就是您将UI元素连接到错误的管理对象,错误的属性或无对象。
调试,将需要看到的代码。
添加editLayer的代码 - 听起来好像有什么地方出错:) – deanWombourne