好的,这是另一个问题。
我正在创建一个名为ProgressView
的UIView,它是一个带有事件指示器和进度条的半透明 View 。
我希望能够在需要时在我的应用程序中的所有不同 View Controller 中使用此 View 。
我知道执行此操作的3种不同方式(但我只对其中一种感兴趣):
1)以编程方式创建整个 View ,并根据需要实例化和配置。不用担心,我得到那个。
2)在界面构建器中创建UIView,添加所需的对象并使用如下所示的方法加载它。问题在于我们基本上是在猜测该 View 是objectAtIndex:0,因为在文档中没有地方我找到对从[[NSBundle mainBundle] loadNibName:
函数返回的元素顺序的引用。
NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"yournib"
owner:self
options:nil];
UIView *myView = [nibContents objectAtIndex:0];
myView.frame = CGRectMake(0,0,300,400); //or whatever coordinates you need
[scrollview addSubview:myView];
3)子类化UIViewController,让它按常规管理 View 。在这种情况下,我永远不会真正将 View Controller 插入堆栈,而只是将其主 View 插入堆栈:
ProgressViewController *vc = [[ProgressViewController alloc] initWithNibName:@"ProgressView" bundle:nil];
[vc.view setCenter:CGPointMake(self.view.center.x, self.view.center.y)];
[self.view addSubview:vc.view];
[vc release];
据我所知,#3是执行此操作的正确方法(除了以编程方式),但我不完全确定释放ProgressView的 View Controller 是否安全,而另一个 Controller 的 View 仍保留其主 View (胆量感觉)说它会泄漏?)?
在这种情况下,我要如何进行内存管理?我应该在何时何地释放ProgressView的 View Controller ?
预先感谢您的想法。
干杯,
罗格
最佳答案
我认为您的解决方案#3通过引入UIViewController实例作为ProgressView的容器来增加不必要的复杂性,以便您可以设置 Nib 绑定(bind)。虽然我确实认为能够使用IBOutlet绑定(bind)属性而不是遍历nib内容是一件好事,但是您可以这样做而无需引入不需要或不需要的UIViewController行为。这应该避免您对如何以及何时释放 View Controller 以及它可能对响应者链或已加载 View 的其他行为产生的副作用(如果有)产生的困惑。
相反,请重新考虑使用NSBundle并利用owner
参数的强大功能。
@interface ProgressViewContainer : NSObject {
}
@property (nonatomic, retain) IBOutlet ProgressView *progressView;
@end
@implementation ProgressViewContainer
@synthesize progressView = progressView;
- (void) dealloc {
[progressView release];
[super dealloc];
}
@end
@interface ProgressView : UIView {
}
+ (ProgressView *) newProgressView;
@end
@implementation ProgressView
+ (ProgressView *) newProgressView {
ProgressViewContainer *container = [[ProgressViewContainer alloc] init];
[[NSBundle mainBundle] loadNibNamed:@"ProgressView" owner:container options:nil];
ProgressView *progressView = [container.progressView retain];
[container release];
return progressView;
}
@end
创建一个名为“ProgressView”的 Nib ,其中包含一个ProgressView,并将其File的Owner类设置为ProgressViewContainer。现在,您可以创建从 Nib 加载的ProgressViews。
ProgressView *progressView = [ProgressView newProgressView];
[scrollView addSubview:progressView];
[progressView release];
如果您对进度 View 进行了多种配置,则可能需要在ProgressView上实现
-initWithNibNamed:
方法,而不是+newProgressView
,以便可以指定用于创建每个ProgressView实例的 Nib 。关于ios - 从nib文件加载UIView而无需猜测,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5413949/