2016-04-08 2 views
0

私のアプリにはtabBarControllerがあります。 UITableViewControllerである別のtabBarをタップすると、ビューは空になり、cellForRowAtIndexPathは発生しません(numberOfRowsInSectionは0またはnilではありません)。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 hideとtabBarControllerビューへの別のビューのプッシュ。 ありがとうございます。

+0

バックグラウンドキューで 'reloadData'を呼び出すことはできません。 – Sulthan

答えて

3

UITabBarControllerはコンテナビューコントローラです。これは、多数のViewControllerの外観を管理します。

表示されているコードは、BookmarkCategoryViewControllerの新しいインスタンスを作成しています。この新しいインスタンスは、タブバーコントローラにあるものではありません。そのため、最初のコードブロックは効果がないようです。画面上のビューコントローラを変更していません。

2つ目のコードブロックは、新しいビューコントローラをプッシュします。その結果、表示されるようになりますが、タブバーコントローラの上にプッシュされます。

タブバーコントローラに既にあるBookmarkCategoryViewControllerにアクセスする必要があります。

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

    }); 

} 
関連する問題