tabBarController 不要触发 cellForRowAtIndexPath UITableViewController

Posted

技术标签:

【中文标题】tabBarController 不要触发 cellForRowAtIndexPath UITableViewController【英文标题】:tabBarController don't fire cellForRowAtIndexPath UITableViewController 【发布时间】:2016-04-08 21:36:18 【问题描述】:

我的应用中有 tabBarController。当点击另一个 UITableViewController 的 tabBar 时,视图为空并且 cellForRowAtIndexPath 不会触发(numberOfRowsInSection 不为零或为零)。

代码是:

- (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 视图。 感谢您的帮助。

【问题讨论】:

您不能在后台队列中调用reloadData 【参考方案1】:

UITabBarController 是一个容器视图控制器。它管理多个 ViewController 的外观。

您显示的代码正在创建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];
        );

    );


【讨论】:

以上是关于tabBarController 不要触发 cellForRowAtIndexPath UITableViewController的主要内容,如果未能解决你的问题,请参考以下文章

宏的初体验

Flutter GestureDetector,onTap自动触发,如何?

旋转后 UITapGestureRecognizer 不会触发

text 将数据导出为ex​​cel

text 将数组导出为ex​​cel

csharp 将数据导出为ex​​cel