Анимация Spinner при загрузке новой страницы

У меня есть UITableView, который из внешнего RSS-канала.

Когда вы выбираете строку, она использует 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];

}

DetailsViewController.m

- (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";
}

С этим кодом возникают две проблемы.

  • Spinner не активируется до тех пор, пока не загрузится новая страница.
  • Spinner не отключается после загрузки.

Если бы кто-нибудь мог помочь мне с этой проблемой, я был бы искренне благодарен.

Ответ 1

Вы добавляете представление индикатора активности в представление контроллера, который нажимает на контроллер подробного представления, поэтому вы его вообще не увидите

попробуйте переместить вторую группу кода в метод viewDidLoad элемента DetailsViewController, вы можете вызвать stopAnimating на индикаторе активности, когда вы закончите загрузку. Чтобы получить ссылку на UIActivityIndicator, вы должны добавить тег

например. in viewDidLoad

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

в методе loadFinished (какой метод вызывается при завершении загрузки)

[[self.view viewWithTag:12] stopAnimating];

Ответ 2

Вам нужно выполнить некоторую работу в фоновом потоке. Если следующая строка соответствует той, которая занимает время:

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.

Конечная точка - вы хотите удалить счетчик из своего супервизора, как только вы остановите его оживление. Кроме того, вы можете иметь один экземпляр счетчика и установить hidesWhenStopped в YES.

Ответ 3

Это вращающееся колесо по размытому виду в быстрой:

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