uialertview 上的活动指示器
Posted
技术标签:
【中文标题】uialertview 上的活动指示器【英文标题】:activity indicator on uialertview 【发布时间】:2012-06-29 14:00:34 【问题描述】:如果用户单击 uialertview 上的某个按钮,我有一个耗时的步骤要做。我想在完成时用活动指示器通知用户。我不确定要获得所需的输出究竟需要做什么。这是流程:
用户点击按钮 1“建造塔”。
UIAlertview 显示“你想这样做吗,这需要时间”
用户点击“是”: 现在我在 alertview Delegate 方法中。
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
if (buttonIndex == 1) //Yes the user wants to do this
//Show activity indicator here
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.center = CGPointMake(alert.bounds.size.width / 2, alert.bounds.size.height - 50);
[indicator startAnimating];
[alertView addSubview:indicator];
[indicator release];
//
[SimpleFunctions doThatMethodThatTakesALongTime];
//remove activity indicator here
在这里,我想在“大处理”完成之前显示一个活动指示器。
向 alertview 添加活动指示器的示例展示了如何将指示器添加到上述警报视图。但我不希望该指示器出现,直到用户单击“是”。 关于如何实现这一目标的任何指示都会很棒。我希望我把问题说清楚了,如果没有,请告诉我,
谢谢
【问题讨论】:
你想在你的第一个警报上显示活动指示器还是当你点击警报并且它进入委托时...有点混乱让你的问题更清楚 您好,感谢您的回复。我希望活动指示器仅在用户在警报中按下是时才显示 - 而不是在第一个警报中。我将用括号编辑我的问题以使其更清楚。 【参考方案1】:警报视图参考:http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIAlertViewDelegate_Protocol/UIAlertViewDelegate/UIAlertViewDelegate.html
在委托方法- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
中,您可以在那里向alertView 添加内容。
例如
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
UIActivityIndicator * ai = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[alertView addSubview:activityIndicator];
activityIndicator.frame = CGRectMake(80, 0, 30, 30);
[ai startAnimating];
您想将 ai
添加为 ivar(类变量)以便稍后将其删除。
[self.ai removeFromSuperview];
希望这会有所帮助。
编辑:要记住的一件事是,这样您可能必须自己管理解除警报视图。您可以在警报视图上使用方法- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated
将其关闭。
【讨论】:
您好,感谢您的回复,但是,如果我在那个大方法之前添加活动指示器,它只有在方法完全执行后才会显示。它不会立即显示出来,因为我猜当您添加子视图时,处理只是继续到下一步。它完成了该步骤,然后显示活动指示器,但这对我来说没有用。希望它清楚。 哦,对了,我记得这个。您需要在另一个线程中运行您的进程,以便 Activity 指示器可以在 UI 线程中运行。 这个问题的答案会对你有所帮助***.com/questions/5879582/… 只是为了澄清。发生的是屏幕上发生的一切都在主线程(称为UI线程)中运行。当您“正常”编程时,您正在使用 UI 线程。您需要一段时间的方法将“阻塞” UI 线程,从而停止指示器的动画(或可能根本不显示)。您需要创建一个新线程来运行您的计算,以便 UI 线程不会被阻塞并且您的活动指示器将正常工作。希望这对老兄有帮助。 是的,我想线程会解决的,谢谢,让我试试【参考方案2】:这里:
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
if (buttonIndex == 1) //Yes the user wants to do this
UIActivityIndicatorView *loading = [[UIActivityIndicatorView alloc]
initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
loading.frame=CGRectMake(150, 150, 16, 16);
[YOURAlertView addSubview:loading];
[SimpleFunctions doThatMethodThatTakesALongTime];
[self performSelector:@selector(turnOff:) withObject:nil afterDelay:1.0];
-(void) turnOff
[loading removeFromSuperview];
【讨论】:
【参考方案3】:根据你在你的委托中使用并制作一个标签来识别不同的不同警报...
UIAlertview *myAlertView = [[UIAlertView alloc] initWithTitle:@"Loading" message:@"Your Message" 代表:自己 取消按钮标题:无 其他按钮标题:无];
UIActivityIndicatorView *loading = [[UIActivityIndicatorView alloc]
initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
loading.frame=CGPointMake(myAlertView .bounds.size.width / 2, myAlertView .bounds.size.height - 40);
[myAlertView addSubview:loading];
[loading release];
[myAlertView show];
希望对你有帮助
【讨论】:
【参考方案4】:使用AlertView
的边界来布局活动指示器是个好主意,但请注意,在调用[alertView show]
之前AlertView
的边界都为零。
【讨论】:
以上是关于uialertview 上的活动指示器的主要内容,如果未能解决你的问题,请参考以下文章
搜索视图控制器推送 VC 时,活动指示器不会出现在自定义 UIAlertView 的中心