2016-04-08 6 views
0

У меня есть tabBarController в моем приложении. когда коснитесь другого tabBar, который является UITableViewController, вид пуст и cellForRowAtIndexPath dosen't fire (numberOfRowsInSection не равен нулю или нулю).tabBarController не запускает cellForRowAtIndexPath UITableViewController

Кодекс:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{ 
[[viewController navigationController] popToRootViewControllerAnimated:NO]; 
switch (tabBarController.tabBar.selectedItem.tag) { 
    case 1: 
     NSLog(@"Home"); 
     break; 
    case 2: 
     NSLog(@"Profile"); 
     break; 
    case 3: 
    { 
     NSLog(@"Bookmark"); 
     BookmarkCategoryViewController *bookmarkVC =[self.storyboard instantiateViewControllerWithIdentifier:@"BookmarkCategory"]; 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
      /// Background work 
      BookmarkManager *p = [[BookmarkManager alloc]init]; 
      [p fetchBookmarks:self.categoryId]; 
      bookmarkVC.entries = p.appRecordList; 
      bookmarkVC.categoryId = self.categoryId; 
      bookmarkVC.ID_list_entries = _ID_list_entries; 

      [bookmarkVC.tableView reloadData]; 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       /// Update UI 

       [tabBarController setSelectedIndex:1]; 
      }); 
     }); 

    } 
     break; 
    case 4: 
     NSLog(@"Setting"); 
     break; 
    default: 
     NSLog(@"Home"); 
     break; 
} 
} 

но тот же самый код, когда изменение:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{ 
[[viewController navigationController] popToRootViewControllerAnimated:NO]; 
switch (tabBarController.tabBar.selectedItem.tag) { 
    case 1: 
     NSLog(@"Home"); 
     break; 
    case 2: 
     NSLog(@"Profile"); 
     break; 
    case 3: 
    { 
     NSLog(@"Bookmark"); 
     BookmarkCategoryViewController *bookmarkVC =[self.storyboard instantiateViewControllerWithIdentifier:@"BookmarkCategory"]; 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
      // Background work 
      BookmarkManager *p = [[BookmarkManager alloc]init]; 
      [p fetchBookmarks:self.categoryId]; 
      bookmarkVC.entries = p.appRecordList; 
      bookmarkVC.categoryId = self.categoryId; 
      bookmarkVC.ID_list_entries = _ID_list_entries; 

      [bookmarkVC.tableView reloadData]; 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       /// Update UI 

       [bookmarkVC setModalTransitionStyle:UIModalTransitionStyleCoverVertical]; 
       [self.navigationController pushViewController:bookmarkVC animated:YES]; 
      }); 
     }); 

    } 
     break; 
    case 4: 
     NSLog(@"Setting"); 
     break; 
    default: 
     NSLog(@"Home"); 
     break; 
} 
} 

работать правильно! но tabBarController скрыть и другое представление нажать на вид tabBarController. Спасибо за помощь.

+0

Вы не можете вызвать 'reloadData' в фоновом режиме. – Sulthan

ответ

3

A UITabBarController является контроллером контейнера. Он управляет появлением нескольких ViewControllers.

Код, который вы указали, создает новый экземпляр BookmarkCategoryViewController. Этот новый экземпляр не тот, который находится в вашем контроллере панели вкладок, поэтому ваш первый блок кода, похоже, не имеет никакого эффекта; он не изменяет контроллер на экране.

Ваш второй блок кода выталкивает новый контроллер вида, поэтому вы видите эффект, но его перетаскивают поверх верхней панели контроллера панели вкладок.

Что вам нужно сделать, это получить доступ к BookmarkCategoryViewController, который уже находится в контроллере панели вкладок; Вы можете сделать это, используя свойство viewControllers контроллера панели вкладок:

case 3: 
{ 
    NSLog(@"Bookmark"); 
    BookmarkCategoryViewController *bookmarkVC = (BookmarkCategoryViewController *)tabBarController.viewControllers[tabBarController.tabBar.selectedItem]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     // Background work 
     BookmarkManager *p = [[BookmarkManager alloc]init]; 
     [p fetchBookmarks:self.categoryId]; 
     bookmarkVC.entries = p.appRecordList; 
     bookmarkVC.categoryId = self.categoryId; 
     bookmarkVC.ID_list_entries = _ID_list_entries; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [bookmarkVC.tableView reloadData]; 
     }); 

    }); 

} 
Смежные вопросы