我有一个activityIndicator和一个透明的黑色图层。当有东西加载时我会这样显示:
[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中的这个文件中,我正在创建视图。
但这似乎也不起作用。
答案 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名称的差异外没有显示出明显的问题。我决定添加这个答案,希望它能帮助您找到解决方案。
您不需要财产。就保留语义而言,iVars默认为strong
。如果您确实创建了一个属性并按照您展示的方式进行综合,那么请确保在代码中引用self.loadingPlate
或_loadingPlate
。
确保您的iVar名称与您的媒体名称没有拼写错误。例如,如果您有一个名为loadingplate
的iVar,但您的属性为loadingPlate
,那么您最终会得到两个iVars(loadingplate
和loadingPlate
),因为属性会自动创建iVars它们与已经定义的不匹配。
您在loadingPlate
中创建viewDidLoad
视图并根据需要在superview中添加/删除视图的逻辑完全正常。只要确保loadingPlate = nil
以外的任何地方都没有viewDidUnload
。
如果超视图帧大小可能发生变化,则应在将loadingPlate.frame = mainView.bounds
添加为子视图之前明确设置loadingView
。如果框架没有改变,这无关紧要。
如果我想到其他任何事情,我会在以后添加。祝你好运。
答案 4 :(得分:0)
您确定loadingCover
的{{1}}属性是否仍然显示上一次显示的hidden
?
尝试:
YES
答案 5 :(得分:0)
您是否必须使用self.loadingplate强制调用该属性并在视图中保留?