Objective c 加载新页面时设置微调器动画

Objective c 加载新页面时设置微调器动画,objective-c,ios,xcode,Objective C,Ios,Xcode,我有一个来自外部RSS源的UITableView 当您选择一行时,它使用navigationController并从右侧滑入,问题是RSS提要包含图像,因此加载可能需要几秒钟的时间,如果没有任何指示,您可能会将其误认为是应用程序崩溃 我决定添加一个微调器,以便您知道新页面正在加载 这是我的密码: RootViewController.m - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath

我有一个来自外部RSS源的UITableView

当您选择一行时,它使用navigationController并从右侧滑入,问题是RSS提要包含图像,因此加载可能需要几秒钟的时间,如果没有任何指示,您可能会将其误认为是应用程序崩溃

我决定添加一个微调器,以便您知道新页面正在加载

这是我的密码:

RootViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Loading New Page");

[tableView deselectRowAtIndexPath:indexPath animated:YES];
DetailsViewController *detailViewController = [[DetailsViewController alloc] initWithNibName:@"DetailsViewController" bundle:nil];
detailViewController.item = [rssItems objectAtIndex:floor(indexPath.row/2)];
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];

UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spinner.center = CGPointMake(160, 240);
[self.view addSubview:spinner];
[spinner startAnimating];
[spinner release];

}
- (void)viewDidLoad {
    [super viewDidLoad];

        NSString *imgURL = [item objectForKey:@"image"];
        NSData *mydata = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imgURL]];
        item_photo.image = [[UIImage alloc] initWithData:mydata];

    item_title.text = [item objectForKey:@"title"];
    item_date.text = [NSString stringWithFormat:@"Date: %@",[item objectForKey:@"date"]];
    item_time.text = [NSString stringWithFormat:@"Time: %@",[item objectForKey:@"time"]];
    item_cost.text = [NSString stringWithFormat:@"Cost: £%@",[item objectForKey:@"cost"]];
    item_info.text = [item objectForKey:@"description"];
    self.navigationItem.title = @"Event Type";
}
DetailsViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Loading New Page");

[tableView deselectRowAtIndexPath:indexPath animated:YES];
DetailsViewController *detailViewController = [[DetailsViewController alloc] initWithNibName:@"DetailsViewController" bundle:nil];
detailViewController.item = [rssItems objectAtIndex:floor(indexPath.row/2)];
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];

UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spinner.center = CGPointMake(160, 240);
[self.view addSubview:spinner];
[spinner startAnimating];
[spinner release];

}
- (void)viewDidLoad {
    [super viewDidLoad];

        NSString *imgURL = [item objectForKey:@"image"];
        NSData *mydata = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imgURL]];
        item_photo.image = [[UIImage alloc] initWithData:mydata];

    item_title.text = [item objectForKey:@"title"];
    item_date.text = [NSString stringWithFormat:@"Date: %@",[item objectForKey:@"date"]];
    item_time.text = [NSString stringWithFormat:@"Time: %@",[item objectForKey:@"time"]];
    item_cost.text = [NSString stringWithFormat:@"Cost: £%@",[item objectForKey:@"cost"]];
    item_info.text = [item objectForKey:@"description"];
    self.navigationItem.title = @"Event Type";
}
这段代码有两个问题

  • 直到加载新页面后,微调器才会激活
  • 微调器在加载后不会禁用

  • 如果有人能帮我解决这个问题,我将不胜感激。

    您正在将活动指示器视图添加到正在推送详细视图控制器的控制器视图中,因此无论如何您都不会看到它

    尝试将第二组代码移动到DetailsViewController的viewDidLoad方法,加载完成后可以在活动指示器上调用stopAnimating。要获取对UIActivityIndicator的引用,应添加标记

    e、 g.在viewDidLoad中

    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.center = CGPointMake(160, 240);
    spinner.tag = 12;
    [self.view addSubview:spinner];
    [spinner startAnimating];
    [spinner release];
    
    在loadingFinished方法中(以加载完成时调用的方法为准)


    你需要在后台线程中做一些工作。如果以下行需要花费时间:

    detailViewController.item = [rssItems objectAtIndex:floor(indexPath.row/2)];
    
    然后,您可以使用GCD在后台执行此操作:

    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // This is the operation that blocks the main thread, so we execute it in a background thread
        id item = [rssItems objectAtIndex:floor(indexPath.row/2)];
    
            // UIKit calls need to be made on the main thread, so re-dispatch there
            dispatch_async(dispatch_get_main_queue(), ^{
                detailViewController.item = item;
                [spinner stopAnimating];
            });
    });
    
    和+1到@wattson12-您需要将微调器添加到新视图中。或者,您可以将微调器添加到当前视图中,并将
    pushViewController
    调用放入GCD主队列块中


    最后一点-停止设置微调器动画后,您需要将其从superview中删除。或者,您可以使用微调器的单个实例,并将
    hidesWhenStopped
    设置为YES。

    这是swift中模糊视图上方的旋转滚轮:

    func blurScence(){
        let blurEffect: UIBlurEffect = UIBlurEffect(style: .Dark)
        let blurView: UIVisualEffectView = UIVisualEffectView(effect: blurEffect)
        blurView.translatesAutoresizingMaskIntoConstraints = false
        blurView.frame = self.view.frame
    
        let spinner = UIActivityIndicatorView(activityIndicatorStyle:.White)
        spinner.center=blurView.center
        blurView.addSubview(spinner)
        spinner.startAnimating()
    
        self.view.addSubview(blurView)
    }
    

    我认为您仍然缺少停止/删除活动指示器视图的代码。另外:您如何加载图像?如果您使用的是阻塞方法(即不在后台线程中运行的方法),则整个主循环将被阻塞,这意味着:没有用户交互,没有动画等(这将解释此行为)。如果是这种情况,您真的应该切换到异步加载。@TriPhoenix您如何知道它是否是一种阻塞方法?我在DetailsViewController.mYou上添加了代码,可以看出函数的工作方式:阻塞函数将立即返回值,在这种情况下,
    initWithContentsOfURL
    将数据放入
    NSData
    中,因此函数在返回此数据之前无法返回。异步请求更为复杂,因为启动请求时不会返回结果,但请求完成后会对代码调用回调函数。有些框架(如ASIHTTPRequest)可以简化此操作,或者您可以使用NSURLConnection并自行完成此操作。这不起作用,因为在加载所有信息之前,DetailsViewController不会“显示”。详细信息视图不会显示,因为您正在同步加载数据,这会阻止线程。如果要显示动画活动指示灯,则需要在后台执行此请求选中。。。一旦你读到了,就可以使用RestKit或ASIHTTPRequest之类的东西。基本上,您希望在视图出现时启动请求,显示数据正在加载的一些指示,然后在请求完成时,显示下载的数据并删除加载指示。这对我来说非常有效,但我需要将其添加到master detail应用程序中。我最终以同样的方式将微调器加载到主视图中(而不是作为tableview的子视图),然后在我的列表完成加载后,我使用
    [[self.view view withtag:12]removeFromSuperview]从主视图中删除微调器
    ,我收到stopAnimating调用的错误,因为使用stopAnimating方法返回的是视图而不是UIActivityIndicatorView。我使用了此方法,效果非常好。但是,当我试图通过调用
    blurView.removeFromSuperView()
    来停止动画时,它不会改变任何东西。有什么建议吗?