Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 即使在写入[activityIndicator startAnimating]之后,活动指示器也未设置动画_Ios_Objective C - Fatal编程技术网

Ios 即使在写入[activityIndicator startAnimating]之后,活动指示器也未设置动画

Ios 即使在写入[activityIndicator startAnimating]之后,活动指示器也未设置动画,ios,objective-c,Ios,Objective C,我试着搜索,但没有找到任何线索。我还依赖于放下一个按钮,当我尝试在该按钮的功能中设置活动指示器的动画时,它正在设置动画 只要我用按钮的方法编写代码,活动指示器就开始工作了 请提出改进建议 NSString *home= @"http://kivihealth.com/api/"; NSString *apiType = @"patientapi/"; NSString *apiMethod = @"authenticatepatient?"; NSMutableString *url = [

我试着搜索,但没有找到任何线索。我还依赖于放下一个按钮,当我尝试在该按钮的功能中设置活动指示器的动画时,它正在设置动画

只要我用按钮的方法编写代码,活动指示器就开始工作了

请提出改进建议

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];
    }
}

}[self.activityIndicator startAnimating]使用了viewDidLoad方法,而[self.activityIndicator stopAnimating]在end方法中使用了它


问候。

[self.activityIndicator startAnimating]使用了viewDidLoad方法,而[self.activityIndicator stopAnimating]在end方法中使用了它


您好。

为了使用活动指示器,您需要使用某种启动/完成逻辑,基本上您现在正在做的是启动动画并在之后立即结束,没有任何延迟。

为了使用活动指示器,您需要使用某种启动/完成逻辑,基本上,你现在正在做的是开始动画,然后立即结束,没有任何延迟。

编辑自从我最初发布这部电影以来,很多东西都发生了变化

动画的执行必须在主线程上进行,而加载的过程必须在另一个线程上进行

如果希望在一个线程上运行所有内容,那么只要执行/运行循环未完成,主线程(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()
旧解决方案:

这是一个你可以做的例子

[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
    });
});

在我看来,整个代码应该看起来不同,试着用它来更好地组织你的网络代码。阅读页面上的文档并考虑使用

<强>编辑,自从我最初发布这篇文章<

以来,很多改变了。 动画的执行必须在主线程上进行,而加载的过程必须在另一个线程上进行

如果希望在一个线程上运行所有内容,那么只要执行/运行循环未完成,主线程(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()
旧解决方案:

这是一个你可以做的例子

[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
    });
});

在我看来,整个代码应该看起来不同,试着用它来更好地组织你的网络代码。读取页面上的文档,并在调用<代码> NSDAT*数据= [NSdata DATAWAN CONTURSONURL:FielalURL]时,考虑使用

< P>;代码>从主线程,这也会阻止UI和任何动画。这实际上不应该从主线程调用。

当您调用
NSData*data=[NSData dataWithContentsOfURL:finalUrl]从主线程,这也会阻止UI和任何动画。这真的不应该从主线程调用。

在我的例子中,我在
customCell
上使用
activityIndicator
作为
tableView
,我遇到了同样的问题,即使在写下
activityIndicator.startAnimating()
加载没有移动

经过几个小时的努力,我终于想出了一个解决办法

override func prepareForReuse() {
       activityIndicator.startAnimating()
}

只需使用方法
prepareforeuse()
show当您重用
customCell
时,
activityIndicator

在我的例子中,我在
customCell
上使用
activityIndicator
作为
表视图,我遇到了同样的问题,即使在写下activityIndicator.startAnimating()之后,加载也没有移动

经过几个小时的努力,我终于想出了一个解决办法

override func prepareForReuse() {
       activityIndicator.startAnimating()
}

只需使用方法
prepareforuse()
show当您重新使用
customCell
时,
activityIndicator
正在设置动画

我试图删除登录按钮以外的按钮我试图删除登录按钮以外的按钮,这非常有用。@KaranSingh当然-如果您喜欢答案,如果你能接受或投赞成票,我将不胜感激:)那真的很有帮助。@KaranSingh当然-如果你喜欢这个答案,如果你能接受或投反对票,我将不胜感激:)