我完全没有这个想法...我尝试了很多变化,我晕了......
我有一个主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。
答案 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)
使用委托模式怎么样?