DismissModalView не работает

Я немного рвал на себе волосы из-за этого. Я создаю очень простое приложение, оно просто загружает rss-канал и отображает его в UITableview, который находится внутри UINavigationController. Пока он загружает канал, я представляю модальное представление.

В моем модальном представлении я показываю UIImageView и UIActivityIndicatorView, которые настроены на вращение. Я использую ASIHTTRequest для асинхронного захвата канала, а затем использую либо блок завершения, чтобы получить строку ответа и остановить счетчик, либо блок отказа, чтобы получить NSError и отобразить представление предупреждения. Это все работает отлично.

Затем я создал протокол для отклонения модального представления из табличного представления, которое вызывается внутри блока завершения. Но модальное представление никогда не сбрасывается! Я попытался вставить его в навигационный контроллер, но возникла точно такая же проблема. Я даже пытался установить делегат модального представления на ноль, но все равно не повезло.

Я проверил это без блоков, используя методы делегата ASIHTTPRequest, и это то же самое, и если я не представляю модальное представление, табличное представление отображается нормально.

Любые идеи? Я пропустил все методы делегата таблицы и источника данных, а также Dealloc и любые неиспользуемые функции.

@interface MainTableViewController () 
-(void)loadModalView;
@end


@implementation MainTableViewController
@synthesize tableView;
@synthesize modalView;

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView
{

   [super loadView];
tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height) style:UITableViewStylePlain];
tableView.delegate = self;
tableView.dataSource = self;
[self.view addSubview:tableView];

   [self loadModalView];


}

-(void)loadModalView
{
    modalView = [[ModalViewController alloc]init];
    modalView.delegate = self;
    [self presentModalViewController:modalView animated:NO];

}


//Modal View Delegate
-(void)downloadComplete
{
modalView.delegate = nil;
[self dismissModalViewControllerAnimated:NO];



}


@end 


@interface ModalViewController ()


- (void)loadView
{
[super loadView];

backgroundImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];

[self.view addSubview:backgroundImage];

spinner = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spinner.frame = CGRectMake(160, 240, spinner.bounds.size.width, spinner.bounds.size.height);
spinner.hidesWhenStopped = YES;
[self.view addSubview:spinner];
[spinner startAnimating];


NSString* urlString = FEED_URL;
NSURL* url = [NSURL URLWithString:urlString];

ASIHTTPRequest* request = [ASIHTTPRequest requestWithURL:url];
[request setCompletionBlock:^{
    // Use when fetching text data
    NSString *responseString = [request responseString];
    [spinner stopAnimating];
    [delegate downloadComplete];
    // Use when fetching binary data

}];
[request setFailedBlock:^{
    NSError *error = [request error];
    UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"Error" message:error.description delegate:self cancelButtonTitle:@"Continute" otherButtonTitles: nil];
    [alert show];
    [alert release];
}];
[request startAsynchronous];



}

Мэтт


person Matt Rees    schedule 09.12.2011    source источник


Ответы (2)


В моем понимании ... ваше решение довольно сложное ... не было бы лучше, если бы класс MainTableViewController был тем, кто загружает каналы ... для ModalView он будет просто действовать как ActivityIndicator и закрывается после загрузки ... так что внутри вашего Представление загрузки MainTableViewController:

- (void)loadView
{
  NSString* urlString = FEED_URL;
  NSURL* url = [NSURL URLWithString:urlString];

  ASIHTTPRequest* request = [ASIHTTPRequest requestWithURL:url];
  [request startAsynchronous];
  //after starting the request show immediately the modalview
  modalView = [[ModalViewController alloc]init];
  [self presentModalViewController:modalView animated:NO];

  [request setCompletionBlock:^{
    // Use when fetching text data
    NSString *responseString = [request responseString];
    //then when it is complete dissmiss the modal
    [modalView dismissModalViewControllerAnimated:NO];

    // Use when fetching binary data
  }];
  [request setFailedBlock:^{
    NSError *error = [request error];
    UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"Error" message:error.description delegate:self cancelButtonTitle:@"Continute" otherButtonTitles: nil];
    [alert show];
    [alert release];
  }];


}

я не использовал блоки в своих проектах, но я думаю, что он будет работать так же.. также я использую простой UIActivityIndicatorView (большой) в качестве подвидов, а не модальных представлений.. к сожалению, я не могу проверить код здесь сейчас.. но я могу проверить это позже, хотя

person otakuProgrammer    schedule 10.12.2011
comment
Спасибо за ответ, но это не помогло. Я чувствую, что проблема может быть связана с потоками, поскольку загрузка выполняется асинхронно и, следовательно, в другом потоке. - person Matt Rees; 10.12.2011

Единственный способ, которым я решил эту ошибку, — это синхронно загрузить данные и нажать и вытолкнуть представление загрузки в стек навигации. Не идеально, но работает.

person Matt Rees    schedule 17.12.2011