【问题标题】:ViewController loses data after custom initViewController 在自定义初始化后丢失数据
【发布时间】:2012-08-14 16:07:40
【问题描述】:

这就是交易:我有一个名为 FieldFormVC 的自定义 UIViewController。为了呈现它,我称之为代码:

FieldFormVC *fieldFormVC = [[FieldFormVC alloc] initWithFieldForm:(FieldForm *)[self getForm] andManagedObjectContext: managedObjectContext];
fieldFormVC.trackManager = self;

fieldFormVC.thisTrackNumber = currentScreenIndex;
fieldFormVC.textSize = textSize;

[navigationController pushViewController:fieldFormVC animated:YES];

其中 [self getForm] 返回一个 FieldForm 对象。 initWithFieldForm: andManagedObjectContext: 方法的代码是:

-(id)initWithFieldForm: (FieldForm *) f  andManagedObjectContext: (NSManagedObjectContext *) moc
{
    if (self = [super init])
    {
        fieldForm = f;
        managedObjectContext = moc;
    }

    return self;

}

我设置了一些断点,当调用 initWithFieldForm: andManagedObjectContext: 时,参数“f”和“moc”包含实际值。在方法结束时,fieldFormVC 拥有它需要的所有值。

现在当它回到第一块代码并调用时

fieldFormVC.trackManager = self;

fieldFormVC 中的所有值都指向 0x00000000。 fieldFormVC 的所有属性都使用@property(非原子,保留)设置,并且它们也是@synthesize'd。

奇怪的是,我使用了类似的 initWith.. 方法,结果非常好,而且我以前从未见过这个问题。如果有帮助,我将在我的项目中使用 Core Data,而 FieldForm 是我模型中的某个实体。感谢您的任何建议和帮助!

更新:

getForm 方法的代码:

-(NSObject *) getForm
   {
    WrapperForm *wrapperForm = (WrapperForm *)[[_fetchedResultsController fetchedObjects]objectAtIndex:currentScreenIndex.intValue];

    FieldForm *fieldForm = wrapperForm.fieldForm;
    PictureForm *pictureForm = wrapperForm.pictureForm;


    if (fieldForm != nil)
    {
        NSLog(@"Class: %@", [wrapperForm.fieldForm.class description]);

        return fieldForm;

    }else if(pictureForm != nil)
    {
        NSLog(@"Class: %@", [wrapperForm.pictureForm.class description]);

        return pictureForm;
    }

    return nil;
}

【问题讨论】:

  • 检查trackManager的getter中发生了什么。
  • @Mundi 好吧,因为第一块代码属于 TrackManager.m,它访问 FieldForm.h 的“@property (nonatomic, retain) TrackManager *trackManager;”线。事实上, fieldFormVC 在 fieldFormVC.trackManager = self; 之前重置了它的变量/值。被调用。
  • 看起来很奇怪。如果getForm 无论如何都返回FieldForm,为什么你必须转换为FieldForm

标签: core-data viewcontroller init


【解决方案1】:

尽管您的方法 getForm 实际上应该返回 FieldForm 类,但您正在转换为 FieldFormgetForm 方法很可能没有返回正确的对象。

【讨论】:

  • 我发布了 [self getForm] 的代码。我有一个通用的 WrapperForm 对象(因为输入 XML 文件的设置方式),它具有 FieldForm 或 PictureForm(但不是两者)。因此,该方法返回 FieldForm 或 PictureForm。
  • 你检查它确实返回一个吗?
  • 是的,我检查了,它返回一个内存地址不是 0x00000000 的对象。此外,我检查以确保在解析 XML 时将实际的 PictureForm 或 FieldForm 传递到每个 WrapperForm 中。问题是调试器完美地完成了 initWith.. 方法,然后返回对象并继续下一行。在下一行完成之前,fieldFormVC 中的变量值被设置为 0x00000000。
  • 您的 init 过程看起来仍然有问题。试试[[FieldForm alloc] init];,一一添加属性。
猜你喜欢
  • 1970-01-01
  • 2015-02-08
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多