价值观传递给另一个视图控制器

问题描述:

我使用的核心数据有一个比较复杂的应用程序时,从管理对象消失,即除了在数据似乎消失了一个实例运作良好。我有一个托管对象类,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]]; 

}

+0

添加editLayer的代码 - 听起来好像有什么地方出错:) – deanWombourne

的值获得存储正确的,他们可以在 viewlayer中取回并返回co正确的值...

这表明值正在进入托管对象并保存到持久存储区。

...但是,当它们在editLayer中被提取时,它们不会返回正确的 值。

对此的唯一解释就是您将UI元素连接到错误的管理对象,错误的属性或无对象。

调试,将需要看到的代码。