1

Когда пользователь нажимает на центр UITabBarItem Представляю мода UIView. Подумайте об этом, как Instagram.UITabBarController setSelectedIndex slow performance

-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{ 

if(viewController == [self.viewControllers objectAtIndex:2]) 
{ 
    CameraViewController *cameraVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"cameraVC"]; 
    UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:cameraVC]; 
    navController.navigationBar.barStyle = UIStatusBarStyleLightContent; 
    [self presentViewController:navController animated:YES completion:nil]; 
    return NO; 
} 
else 
{ 
    return YES; 
} 
} 

Это прекрасно работает.

Когда я закончил делать снимки в CameraViewController, я хочу, чтобы представление было отклонено, и для результатов изображения (HistoryViewController) будет выбран 4 UITabBarItem.

Это, как я сделать это в CameraViewController (который модально толкаемом):

[self dismissViewControllerAnimated:YES completion:nil]; 

[(UITabBarController *)self.presentingViewController setSelectedIndex:3]; 

И это, где он получает багги.

enter image description here

Как вы можете видеть текст на вкладке 4 выбран, но первая вкладка значок еще выбран. Также представленный вид является одним из первого вклада.

Через 10 секунд он в конечном итоге изменяет вид на правильную 4-ю вкладку.

Я пытаюсь выяснить, какой процесс создает это замедление, поэтому я создал множество NSLog.

Примерный 10-секундный спад находится между [(UITabBarController *)self.presentingViewController setSelectedIndex:3]; в CameraViewController и viewDidLoad в HistoryViewController.

Что происходит между этими вызовами/методами, которые могут вызвать замедление?

Edit:

В CameraViewController:

- (void)scan { 
dispatch_queue_t scanTesseract = dispatch_queue_create("scanTesseract", NULL); 

dispatch_async(scanTesseract, ^(void) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [SVProgressHUD setForegroundColor:[UIColor ht_mintDarkColor]]; 
     [SVProgressHUD showProgress:0 status:@"Scanning"]; 
    }); 

    //background processing goes here 
    [self.tesseract setImage:self.imgToScan.blackAndWhite]; 
    [self.tesseract recognize]; 
    [self filterResults:[self.tesseract recognizedText]]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [SVProgressHUD dismiss]; 
    }); 
    [self scanningDone]; 
}); 
} 

- (void)scanningDone { 
[LastScan getInstance].hasBeenViewed = FALSE; 

[self dismissViewControllerAnimated:YES completion:nil]; 

[(UITabBarController *)self.presentingViewController setSelectedIndex:3]; 
} 

В HistoryViewController:

- (void)viewDidLoad { 
[super viewDidLoad]; 

NSLog(@"ViewDidLoad"); 
self.navigationController.navigationBar.barStyle = UIStatusBarStyleLightContent; 

self.collectionView.backgroundColor = [UIColor whiteColor]; 
} 
+0

Это, вероятно, происходит потому, что в вашем методе 'viewDidLoad' на вкладке« История »есть что-то еще, вы должны проверить, что происходит перед NSLog. Можете ли вы вставить код «История»? – gvuksic

+0

Можете ли вы показать больше кода, предшествующего коду камеры. Предпочтительно весь метод, в котором вызывается увольнение. – Spectravideo328

+0

@MobileProjectLab Вот что. Ничего не происходит до 'NSLog' @ Spectravideo328 Я добавил код, который вы запросили. – Galip

ответ

1

Вы вызываете свой scanDone из фоновой очереди. Выполните этот метод в главной очереди.

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self scanningDone]; 
}); 
+0

спасибо, вот и все! – Galip

0

Что об этом?

[self dismissViewControllerAnimated:YES completion:^{ 
    [(UITabBarController *)self.presentingViewController setSelectedIndex:3]; 
}];