好的,这是另一个问题。

我正在创建一个名为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/

10-09 07:56