iOS:隐藏后无法显示视图

时间:2011-12-05 09:57:26

标签: ios cocoa-touch

我有一个activityIndi​​cator和一个透明的黑色图层。当有东西加载时我会这样显示:

[activityIndicator startAnimating];
loadingCover.hidden = NO;

当我隐藏它们时,我就是这样做的:

[activityIndicator stopAnimating]; //hides on stop
loadingCover.hidden = YES;

到目前为止一切正常。但不知怎的,如果我想再次展示它们,它就行不通了。有什么想法吗?

修改 我就是这样做的......

- (void)viewDidLoad {
    [mainView addSubview:loadingCover]; //works
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
    [loadingCover removeFromSuperview]; //works
}

- (void)refreshRSS:(id)sender {
    [mainView addSubview:loadingCover]; //doesn't work
}

EDIT2: 首先我用ARC模式进行编码,然后,loadingCover已经改为加载板,没什么大不了的......

好的,在我的.h文件中,我这样做:

UIView *loadingplate;
UIActivityIndicatorView *loadingIndicator;

在viewDidLoad的我的.m文件中,我这样做:

CGRect viewRect = CGRectMake(0, 0, 320, 460);
loadingplate = [[UIView alloc] initWithFrame:viewRect];

UIColor *loadingplateColor = [[UIColor alloc] initWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
[loadingplate setBackgroundColor:loadingplateColor];
loadingplate.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleBottomMargin;

loadingIndicator = [[UIActivityIndicatorView alloc] initWithFrame:viewRect];
[loadingIndicator setContentMode:UIViewContentModeCenter];
[loadingIndicator startAnimating];

loadingIndicator.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleBottomMargin;

[loadingplate addSubview:loadingIndicator];
[mainView addSubview:loadingplate];

EDI3: 在阅读了Jasarien的回答后,我在我的.h文件中尝试了这个:

@property (strong, nonatomic) UIView *loadingPlate;

然后在我的.m文件中:

@synthesize loadingPlate = _loadingPlate;

在viewDidLoad中的这个文件中,我正在创建视图。

但这似乎也不起作用。

6 个答案:

答案 0 :(得分:3)

请参阅XJones的评论。这个答案可能是错误的。

编辑后的问题:

似乎既然您正在使用arc,那么您的loadingPlate视图可能会很快发布。

当您分配并初始化loadingPlate视图时,它的保留计数为+1,正如alloc / init所期望的那样。但是,因为您使用ARC,在将其添加为主视图的子视图后,ARC会将其释放。实际上loadingPlate视图由其超级视图拥有,当您从超级视图中删除它时,超级视图会释放它,从而导致视图被取消分配。因此,当你试图再次显示它时,它就不再存在而且无法显示。

解决方法是为loadingPlate视图创建一个属性,并为其提供一个“强大”引用(实际上与将该属性声明为“retain”)相同。这样,具有此属性的对象将拥有loadingPlate视图,并保留对它的强引用。

答案 1 :(得分:1)

你说loadingCover.hidden = NO不起作用?您是否已将视图作为子视图添加到当前显示视图中?

答案 2 :(得分:1)

尝试将该视图的分配和初始化移动到init方法。此外,当您调用该方法再次添加它时,您可以尝试的一件事就是首先检查它是否存在,可能是:

if (!loadingPlate) {
// allocate and initialize again because somehow it has been released.
}

至少这样你知道loadPlate的实例是否仍然被保留。

答案 3 :(得分:1)

创建,显示和隐藏loadingPlate的基本逻辑看起来很好。我在我的应用程序中使用UIView子类中抽象的非常类似的实现。所有的答案都是黑暗中的b / c你发布的代码除了iVar名称的差异外没有显示出明显的问题。我决定添加这个答案,希望它能帮助您找到解决方案。

  1. 您不需要财产。就保留语义而言,iVars默认为strong。如果您确实创建了一个属性并按照您展示的方式进行综合,那么请确保在代码中引用self.loadingPlate_loadingPlate

  2. 确保您的iVar名称与您的媒体名称没有拼写错误。例如,如果您有一个名为loadingplate的iVar,但您的属性为loadingPlate,那么您最终会得到两个iVars(loadingplateloadingPlate),因为属性会自动创建iVars它们与已经定义的不匹配。

  3. 您在loadingPlate中创建viewDidLoad视图并根据需要在superview中添加/删除视图的逻辑完全正常。只要确保loadingPlate = nil以外的任何地方都没有viewDidUnload

  4. 如果超视图帧大小可能发生变化,则应在将loadingPlate.frame = mainView.bounds添加为子视图之前明确设置loadingView。如果框架没有改变,这无关紧要。

  5. 如果我想到其他任何事情,我会在以后添加。祝你好运。

答案 4 :(得分:0)

您确定loadingCover的{​​{1}}属性是否仍然显示上一次显示的hidden

尝试:

YES

答案 5 :(得分:0)

您是否必须使用self.loadingplate强制调用该属性并在视图中保留?