从动态实例化的类(objective-c)设置主视图控制器中的属性值

时间:2011-06-21 22:49:52

标签: objective-c ios cocoa-touch ipad

我完全没有这个想法...我尝试了很多变化,我晕了......

我有一个主UIViewController,只需按一下按钮,就可以在其子视图中添加另一个UIViewController。添加动态UIVC时,主UIVC中的属性会更新以保存对它的引用(称为currentObject)。这很好。

我遇到的问题是,如果我添加另一个动态UIVC,持有引用的属性最初会正确更新,但无论我尝试什么,当触摸第一个动态UIVC时,我都无法更新属性。我尝试从动态UIVC设置“currentObject”的一切都给了我一个“无法识别的选择器发送到类”错误,然后保释。

我暂时没有把代码放到这篇文章中。不确定我会发布哪些内容会有所帮助。

提前致谢!

更新:

在DynamicModuleViewController.h中:

@interface DynamicModuleViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIPopoverControllerDelegate, UIGestureRecognizerDelegate, UITextViewDelegate, UIApplicationDelegate, MFMailComposeViewControllerDelegate>{

DynamicModule *currentObject;

}

@property(nonatomic, retain) DynamicModule *currentObject;

在DynamicModuleViewController.m中:

@implementation DynamicModuleViewController

@synthesize currentObject;

-(void)addObject:(id)sender
{
DynamicModule *dm = [[DynamicModule alloc]init];
// positioning and PanGesture recognition code to allow dragging of module
currentObject = dm;
[mainView addSubview:currentObject.view];
}

@end

以这种方式添加,从按钮点击,它工作正常。

再次实例化DynamicModules,我需要使用最后点击的DynamicModule更新currentObject。

2 个答案:

答案 0 :(得分:1)

  

将另一个UIViewController添加到其子视图之一

首先,这对我来说是个红旗。添加UIViewController的视图作为子视图几乎总是错误的方式来管理视图层次结构和iOS应用程序中的常见错误。请参阅http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/,以便继续讨论主题,避免重复自己。

  

currentObject = dm;

这会将ivar设置为直接支持您的currentObject属性。您正在泄漏之前的currentObject值。您似乎没有从currentObject删除之前的mainView视图。我怀疑您将currentObject设置为自动释放的对象,因为您绕过了您的setter而未能保留它,并最终尝试向已发布的对象发送消息,导致消息到达时出现“无法识别的选择器”错误当你试图引用一个不再存在的对象时,其他任何对象现在占用该内存地址或BAD_ACCESS错误。

self.currentObject = foo相当于[self setCurrentObject:foo],可能与您的意图相同。

答案 1 :(得分:0)

使用委托模式怎么样?