我试过搜索,但没有发现任何线索。此外,我依旧放下一个按钮,当我在该按钮的功能中尝试动画活动指示器时,它就是动画。
只要我在按钮的方法中编写代码,活动指示器就会工作。
请提出改进建议
NSString *home= @"http://kivihealth.com/api/";
NSString *apiType = @"patientapi/";
NSString *apiMethod = @"authenticatepatient?";
NSMutableString *url = [[NSMutableString alloc]initWithString:home];
[url appendString:apiType];
[url appendString:apiMethod];
NSString *temp=[NSString stringWithFormat:@"email=%@&password=%@",self.emailInputted.text,self.PasswordInputted.text];
[url appendString:temp];
// PROBLEM - NOT WORKING
[self.activityIndicator startAnimating];
NSURL *finalUrl = [NSURL URLWithString:url];
NSData *data = [NSData dataWithContentsOfURL:finalUrl];
NSError *error;
[self.activityIndicator stopAnimating];
if(data == nil)
{
UIAlertView *invalidDetailsAlert = [[UIAlertView alloc]initWithTitle:@"SIGN IN FAILED" message:@"Netwok error" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[invalidDetailsAlert show];
}
else
{
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSDictionary *da = json[@"data"];
NSString *message = da[@"message"];
if ([message isEqualToString:@"Valid Details"])
{
//NSLog(@"Inside Valid");
//NSLog(@"%@",da);
Patient *defaultPatient = [[Patient alloc]init];
defaultPatient=[defaultPatient initWithRegId:da[@"regid"] city:da[@"city"] area:da[@"area"] mobile:da[@"mobile"] landline:da[@"landline"] dob:da[@"dob"] sex:da[@"sex"] name:da[@"name"] chronicDiseases:da[@"chronicdiseases"] aboutHealth:da[@"abouthealth"] email:self.emailInputted.text];
[defaultPatient saveAsDefaultUser];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
AfterLoginViewController *afterLoginViewController = (AfterLoginViewController *)[storyboard instantiateViewControllerWithIdentifier:@"AfterLoginViewController"];
[self presentViewController:afterLoginViewController animated:YES completion:nil];
}
else
{
UIAlertView *invalidDetailsAlert = [[UIAlertView alloc]initWithTitle:@"SIGN IN FAILED" message:message delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[invalidDetailsAlert show];
}
}
}
答案 0 :(得分:1)
[self.activityIndicator startAnimating]使用方法viewDidLoad和[self.activityIndicator stopAnimating]在end方法中使用它。
问候。
答案 1 :(得分:1)
你需要使用某种启动/完成逻辑才能使用活动指示器,基本上你现在正在做的就是开始动画并在此之后结束它,没有任何延迟。
答案 2 :(得分:1)
自从我最初发布此内容后,编辑已经发生了很多变化
动画的执行必须在主线程上发生,而加载的过程必须在另一个线程上发生。
如果你想在一个线程上运行所有东西,只要执行/运行循环没有完成,主线程(运行UI的地方)就会被阻塞。
Swift 3
let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
// put the activityIndicator to use somewhere or use an IBOutlet
activityIndicator.startAnimating()
DispatchQueue.global(qos: .background).async {
// do your stuff
DispatchQueue.main.async {
activityIndicator.stopAnimating()
}
}
不幸的是,这不再适用于网络通话,因为它的性质已经转移到URLSession
,它看起来像这样:
let url = URL(with: "http://google.com")
let urlRequest = URLRequest(string: url)
let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
// do some parsing and verify/validate your response is not an error
// eg the response.statusCode could be helpful to see if an error occurred
...
DispatchQueue.main.async {
// report back to ViewController
}
}
task.resume()
OLD SOLUTION:
这是你可以做的一个例子
[self.activityIndicator startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *finalUrl = [NSURL URLWithString:url];
NSData *data = [NSData dataWithContentsOfURL:finalUrl];
NSError *error;
// do stuff
dispatch_async(dispatch_get_main_queue(), ^{
[self.activityIndicator stopAnimating];
// UI Updates
});
});
在我看来,整个代码应该看起来不同,请尝试使用AFNetworking来更好地组织网络代码。阅读页面上的文档并考虑使用Cocoapods
答案 3 :(得分:1)
当您从主线程调用NSData *data = [NSData dataWithContentsOfURL:finalUrl];
时,这也会阻止UI和任何动画。实际上不应该从主线程中调用它。
答案 4 :(得分:0)
就我而言,我在 activityIndicator
上使用 customCell
作为 tableView
并且我遇到了同样的问题,即使在写下 activityIndicator.startAnimating()
之后加载也没有移动.
经过数小时的尝试,我想出了一个解决方案。
override func prepareForReuse() {
activityIndicator.startAnimating()
}
当您重复使用 prepareForReuse()
正在设置动画的 customCell
时,只需使用方法 activityIndicator
show