2010-08-16 76 views
1

我想显示一个简单的加载对话框,当我的应用程序发生某些事情时。我想我会创建一个新的视图,为其添加一个标签,然后将该视图设置为当前视图的子视图。iPhone:添加“加载”子视图

当这样做时,我什么都看不到!

这里是我怎么写我的方法:

- (void)showLoading { 
    UIView *loading = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; 
    loading.backgroundColor = [UIColor blackColor]; 
    UILabel *txt = [[UILabel alloc] initWithFrame:CGRectMake(198, 9, 94, 27)]; 
    txt.text = @"Loading..."; 
    txt.textColor = [UIColor whiteColor]; 
    [loading addSubview:txt]; 
    [super.view addSubview:loading]; 
    [super.view bringSubviewToFront:loading]; 
    [loading release]; 
    [txt release]; 
} 

我这样做完全错了吗?

编辑: 我把它添加到viewDidLoad方法,它的作品我多么希望:

loading = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)]; 
    loading.backgroundColor = [UIColor blackColor]; 
    UILabel *txt = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 94, 27)]; 
    txt.text = @"Loading..."; 
    txt.textColor = [UIColor whiteColor]; 
    [loading addSubview:txt]; 
    [txt release]; 
    [self.view addSubview:loading]; 
    [self.view bringSubviewToFront:loading]; 

但是从方法加载的时候,它似乎滞后,并没有显示出来了一点。

回答

2

尽管这并不直接回答你的问题,但我建议从GitHub中抓取MBProgressHUD并使用它代替静态标签。看起来更好,更少的代码供你直接维护等。你可以在http://github.com/matej/MBProgressHUD找到它

我使用它的方式是通过创建UITableViewController的子类并定义一些显示和隐藏HUD视图的方法。从那里,当我加载或完成加载时,我会调用每个相关的方法。

具体来说,我有四种方法:-hudView,-showLoadingUI,-showLoadingUIWithText:和-hideLoadingUI。

-hudView创建一个新的MBProgressHUD对象(如果尚不存在),并将其添加到当前视图([self.view addSubview:hudView])。

-showLoadingUI调用-showLoadingUIWithText:使用默认标题,-showLoadingUIWithText:只是取消隐藏MBProgressHUD并为其设置标签值(self.hudView.labelText = @“foo”;)。

-hideLoadingUI隐藏hudView([self.hudView hide:YES])。

+0

我想在显示HUD时显示HUD,但由于某种原因,它会一直等待循环显示HUD。这是正常的吗? – 2010-08-16 02:37:17

+0

这是一个正常的错误:试图从主线程或Web线程以外的线程获取Web锁。这可能是从辅助线程调用UIKit的结果。现在崩溃...? – 2010-08-16 02:56:43

+0

通过在主线程中运行我的UI代码修复了错误。 – 2010-08-16 20:55:37

1

首先,我不认为UIView有方法叫做init。你可以称它为超级。您应该调用的适当方法是- (id)initWithFrame:(CGRect)aRect。该框架是您想要显示的视图的大小。 More here

另一件事是你为什么叫[super.view addSubView:],我认为它应该是self.view,不是吗?

+0

是的,[self.view addSubView:loading] 您可能想要考虑将它(加载视图)分配给一个实例变量,以便您可以跟踪它,以便您可以稍后从视图中删除它。 – 2010-08-16 02:13:53

+0

如果他不想分配它,我认为没关系。因为如果目的只是显示一次,并释放整个视图时释放。但是如果他想在此之前删除它,他应该有一个实例变量 – vodkhang 2010-08-16 02:16:32