好的,这是另一个问题.
我正在创建一个名为ProgressView的UIView,它是一个带有活动指示器和进度条的半透明视图.
我希望能够在需要时在我的应用程序中的不同视图控制器中使用此视图.
我知道有3种不同的方式(但我只对其中一种感兴趣):
1)以编程方式创建整个视图,根据需要进行实例化和配置.不用担心我得到那个.
2)在界面构建器中创建UIView,添加所需的对象并使用如下方法加载它.问题在于我们基本上猜测视图是objectAtIndex:0因为在文档中没有找到对[[NSBundle mainBundle] loadNibName:函数]返回的元素顺序的引用.
NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"yournib" owner:self options:nil]; UIView *myView = [nibContents objectAtIndex:0]; myView.frame = CGRectMake(0,300,400); //or whatever coordinates you need [scrollview addSubview:myView];
3)子类UIViewController,让它按照正常方式管理视图.在这种情况下,我永远不会实际将视图控制器推入堆栈,而只是将其视图:
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的视图控制器是否安全,而另一个控制器的视图保留其主视图(直觉说它会泄漏?)?
在这种情况下,我应该在内存管理方面做些什么,我应该在何时何地发布ProgressView的视图控制器?
提前感谢您的想法.
干杯,
ROG
解决方法
我认为您的解决方案#3通过引入UIViewController实例作为ProgressView的容器来增加不必要的复杂性,以便您可以设置nib绑定.虽然我认为能够使用IBOutlet绑定属性而不是遍历nib内容是很好的,但您可以这样做,而无需引入您既不需要也不想要的行为的UIViewController.这应避免您对如何以及何时释放视图控制器及其对响应程序链或加载视图的其他行为可能产生的副作用(如果有)产生混淆.
相反,请重新考虑使用NSBundle并利用该所有者参数的强大功能.
@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”的包含ProgressView的nib,并将其File的Owner类设置为ProgressViewContainer.现在,您可以创建从笔尖加载的ProgressView.
ProgressView *progressView = [ProgressView newProgressView]; [scrollView addSubview:progressView]; [progressView release];
如果您有多个进度视图配置,那么您可能希望在ProgressView上实现-initWithNibNamed:方法而不是newProgressView,这样您就可以指定用于创建每个ProgressView实例的nib.