如何在标签中使用相同的UIView?

时间:2010-09-25 21:41:01

标签: iphone uiview uitabbarcontroller instance

我有一个小的UIView,我用net填充了一些字符串数据。 我想加载一次。这就是为什么我在appdelegate类中调用它。

CurrencyView * currView;

@property(非原子,保留)CurrencyView * currView;

应用程序中的

didFinishLaunchingWithOptions:

CurrencyView *view=[[CurrencyView alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
self.currView = view;
[view release];

然后我在每个viewcontroller中调用它(在标签中)。

    AppDelegate_iPhone *delegate = [AppDelegate_iPhone sharedAppDelegate];
    self.currencyView= delegate.currView
    [self.view addSubview: currencyView];

当我在标签中移动时,currView从标签移动到其他标签。当回顾上一个标签时,currencyview消失了。它停留在最后一个标签上。我不知道为什么。

如何将currview放在所有视图中?

3 个答案:

答案 0 :(得分:0)

你不能同时将UIView放到不同的控制器上。当您将其添加到另一个控制器/视图时,它将从之前的控制器/视图中删除。

所以你应该在更改tab ^^时重新添加它(例如,使用委托方法。这取决于你使用的是什么; - )

我认为没有其他解决办法,但如果有人有更好的想法,我会感兴趣。

答案 1 :(得分:0)

如果要共享同一个视图实例,可以在viewcontroller viewWillAppear:方法中从appdelegate中检索实例,检查视图的superview是否为nil并最终将其从superview中删除,然后将其添加到当前视图。像这样的东西

-(void)viewWillAppear {

AppDelegate_iPhone *delegate = [AppDelegate_iPhone sharedAppDelegate];
CurrencyView *cView = [delegate currView];
if(nil!=[cView superview) {
[cView removeFromSuperview];
}
[[self view]addSubview:cView];
}

也许您可以从 viewWillDisappear:方法中的superview中删除currView,而不是上面的方法。

尽管如此,这仍然非常容易出错并且不是很干净。如果你只分配两个CurrencyView实例并让它们共享公共数据/模型会更好。 如果内存不足,我怀疑单个视图会杀死你的应用程序,但如果是这种情况还有其他减少内存占用的方法,请参阅Apple关于内存管理和查看控制器生命周期的文档。

答案 2 :(得分:0)

如果您想要的是视图的副本,* cView的@property语句应为

@Property (nonatomic, copy) UIView* cView;

如果您拥有的是

@Property (nonatomic, retain) UIView* cView;

您正尝试在多个视图中共享同一个对象,而这是您无法做到的。有了前者,每次你从superview中获取它,你都会复制它,我认为这样可行。