Code Bye

TabBarController的问题

 
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    //这里的myTable是一个TableView对象

    TablesForCollectionViewController * myTable = [[[TablesForCollectionViewController alloc] initWithNibName:@"TablesForCollectionView" bundle:nil] autorelease];
    myTable = [[[TablesForCollectionViewController alloc] initWithStyle:UITableViewStylePlain]autorelease];
    myTable.view.frame = CGRectMake(0, 44, 320, 480);
    
    //初始化scrollView对象
    UIScrollView *scrollView = [[[UIScrollView alloc] initWithFrame:CGRectMake(0, 44, 320, 440)]autorelease];
    scrollView.directionalLockEnabled = YES;
    scrollView.pagingEnabled = NO;
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.showsVerticalScrollIndicator = NO;
    scrollView.delegate = self;

    //初始化collectionView对象
    CollectionViewController *collectionView = [[CollectionViewController alloc] initWithNibName:@"CollectionView" bundle:nil];
//collection.view中包含了ScrollView,ScrollView中包含的是myTable的view
    if([_tabBarController selectedIndex] == 2){
        NSLog(@"CollectionView");
        [myTable.tableView reloadData]; //重新加载TableView中的数据
        [collectionView.view addSubview:scrollView]; 
        [scrollView addSubview:myTable.view];
    }
}

小弟新手,不知道为啥reloadData不起作用,因为我在此按Item时,并没有更新数据。只有重启程序之后才能看到更新了数据。请大侠们指点一二。谢谢!

20分
本来想说应该在didselect的时候reload,可以一看吓一跳,每点一次item会alloc一堆然后add上去。。。
这个时候viewcontroller已经在界面上了,直接判断viewcontroller是不是你需要刷新的那个controller
tabbarcontroller就直接用形参了,不需要一个变量_tabbabrcontroller了
还有,这时table还没add到界面上,基本上来说reloadtable只会更新cellinvisible的cell,不过当然datasource已经更新,应该也是会更新的。
引用 1 楼 arthurchenjs 的回复:

本来想说应该在didselect的时候reload,可以一看吓一跳,每点一次item会alloc一堆然后add上去。。。
这个时候viewcontroller已经在界面上了,直接判断viewcontroller是不是你需要刷新的那个controller
tabbarcontroller就直接用形参了,不需要一个变量_tabbabrcontroller了
还有,这时table还没add到界面上……

我上述的代码,每次点第三个Item,都会执行NSLog(@”CollectionView”);,但是我就是不知道要怎么刷新,我的想法是说,只要我每次点这个item,那我就重新的初始化这个iten对应视图里的所以视图,比如scrollView,TableView等,但还是没效果。我没有再用_tabbabrcontroller而是直接上了函数中的形参,也不行!

你说的对,刚我打印了一下数据库中的数据,我的数据是有更新的,但是就是TableView中并没有读到数据的更新,也就是说,没有跟着更新!不知道怎么办才好了~  请教,谢谢
如果table只在这里alloc
我没有留意到在什么地方设置table的delegate和datasource
不知会不会是这个引起的。
引用 4 楼 arthurchenjs 的回复:

如果table只在这里alloc
我没有留意到在什么地方设置table的delegate和datasource
不知会不会是这个引起的。

我是在viewDidLoad中设置的
 self.tableView.delegate = self;
 self.tableView.datasource = self; 

后来我试着在viewWillAppear中调用:  [self.tableView reloadData];
然后
if([_tabBarController selectedIndex] == 2){
        NSLog(@”CollectionView”);
        TablesForCollectionViewController * myTable = [[[TablesForCollectionViewController alloc] init] autorelease];    
        [myTable viewWillAppear:YES];     
             }
这样还是不行,好像reloadData失效了,在网上找了一些失效的原因,可和我的都不一样。就卡在这了~

这回没看出来,我也不知道了
不过,我总觉得,不应该在didselect来new东西
就像五个抽屉,应该是先填满在一个一个的切换,而不是切换时在填东西。
如果从设计的角度讲
因为tabbar只是一个item的容器,而item是viewcontroller的东西
这时应该只是告诉viewcontroller,你的item被选中了,
相应的viewcontroller收到被选中的消息后干自己的事(更新)
tabbar越权,也许以后代码会变的不好看。
一点愚见。
你说的有道理,谢谢!我也是不得已,想看看这样能不能行得通才这样做的。
我现在想法是这样的,我想可不可以在按其他item的时候,把这个item的Controller 先推出栈去,然后按这个item时候 重新初始化里面的视图,压栈应该是自动的吧? 不懂这样是否可行,我实在想不出办法了~
相信和apple的代码一样,肯定有一个优雅的办法解决。
有什么想法都试试吧,肯定有收获的。
10分
你的tabBar应该在初始化Items时将各个控制器初始化好。在didselect方法中你只需要对将要推出的视图显示出来就可以了。
10分
引用 9 楼 zhanglei5415 的回复:

你的tabBar应该在初始化Items时将各个控制器初始化好。在didselect方法中你只需要对将要推出的视图显示出来就可以了。

reloadData不应该在这个位置调用

我的问题解决了   我又重新组织了一下我的代码    我直接用item对用的视图控制器继承UItableViewController,而不是UIViewController 然后没有再重写
– (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
这个函数,而是直接在tableView的ViewWillAppear中去[self.table reloadData],然后重新读取数据库的内容,就行了。可能我说的有点乱,谢谢你们的回答~
不乱,我看明白了,方法也是很对路的。
O(∩_∩)O
你在didSelect方法里的tableview是你需要更新的controller里的tableview吗?….
还有你的tableview怎么alloc里两次? 不明白…
你不该在didselect方法里alloc新控件在添加到controller, 这些控件你应该定义在controller里,然后用这个tabbarcontroller的代理方法来判断进入里哪个controller,比如你要进第三个,你可以判断,是的话,那么就是
[controller.tableview reloadData]; 代理方法不是有参数吧,应该好好利用啊

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明TabBarController的问题