TabBarController的问题

linux_fay 2011-06-18 09:55:56
- (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时,并没有更新数据。只有重启程序之后才能看到更新了数据。请大侠们指点一二。谢谢!
...全文
855 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsx923 2011-06-23
  • 打赏
  • 举报
回复
你不该在didselect方法里alloc新控件在添加到controller, 这些控件你应该定义在controller里,然后用这个tabbarcontroller的代理方法来判断进入里哪个controller,比如你要进第三个,你可以判断,是的话,那么就是
[controller.tableview reloadData]; 代理方法不是有参数吧,应该好好利用啊
zsx923 2011-06-23
  • 打赏
  • 举报
回复
你在didSelect方法里的tableview是你需要更新的controller里的tableview吗?....
还有你的tableview怎么alloc里两次? 不明白...
Dansley 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhanglei5415 的回复:]

你的tabBar应该在初始化Items时将各个控制器初始化好。在didselect方法中你只需要对将要推出的视图显示出来就可以了。
[/Quote]
reloadData不应该在这个位置调用
ReyZhang 2011-06-22
  • 打赏
  • 举报
回复
你的tabBar应该在初始化Items时将各个控制器初始化好。在didselect方法中你只需要对将要推出的视图显示出来就可以了。
ArthurChen 2011-06-22
  • 打赏
  • 举报
回复
不乱,我看明白了,方法也是很对路的。
O(∩_∩)O
linux_fay 2011-06-22
  • 打赏
  • 举报
回复
我的问题解决了 我又重新组织了一下我的代码 我直接用item对用的视图控制器继承UItableViewController,而不是UIViewController 然后没有再重写
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
这个函数,而是直接在tableView的ViewWillAppear中去[self.table reloadData],然后重新读取数据库的内容,就行了。可能我说的有点乱,谢谢你们的回答~
linux_fay 2011-06-21
  • 打赏
  • 举报
回复
你说的有道理,谢谢!我也是不得已,想看看这样能不能行得通才这样做的。
我现在想法是这样的,我想可不可以在按其他item的时候,把这个item的Controller 先推出栈去,然后按这个item时候 重新初始化里面的视图,压栈应该是自动的吧? 不懂这样是否可行,我实在想不出办法了~
ArthurChen 2011-06-21
  • 打赏
  • 举报
回复
这回没看出来,我也不知道了
不过,我总觉得,不应该在didselect来new东西
就像五个抽屉,应该是先填满在一个一个的切换,而不是切换时在填东西。
如果从设计的角度讲
因为tabbar只是一个item的容器,而item是viewcontroller的东西
这时应该只是告诉viewcontroller,你的item被选中了,
相应的viewcontroller收到被选中的消息后干自己的事(更新)
tabbar越权,也许以后代码会变的不好看。
一点愚见。
ArthurChen 2011-06-21
  • 打赏
  • 举报
回复
相信和apple的代码一样,肯定有一个优雅的办法解决。
有什么想法都试试吧,肯定有收获的。
linux_fay 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 arthurchenjs 的回复:]
如果table只在这里alloc
我没有留意到在什么地方设置table的delegate和datasource
不知会不会是这个引起的。
[/Quote]
我是在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失效了,在网上找了一些失效的原因,可和我的都不一样。就卡在这了~
linux_fay 2011-06-20
  • 打赏
  • 举报
回复
你说的对,刚我打印了一下数据库中的数据,我的数据是有更新的,但是就是TableView中并没有读到数据的更新,也就是说,没有跟着更新!不知道怎么办才好了~ 请教,谢谢
ArthurChen 2011-06-20
  • 打赏
  • 举报
回复
如果table只在这里alloc
我没有留意到在什么地方设置table的delegate和datasource
不知会不会是这个引起的。
linux_fay 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arthurchenjs 的回复:]
本来想说应该在didselect的时候reload,可以一看吓一跳,每点一次item会alloc一堆然后add上去。。。
这个时候viewcontroller已经在界面上了,直接判断viewcontroller是不是你需要刷新的那个controller
tabbarcontroller就直接用形参了,不需要一个变量_tabbabrcontroller了
还有,这时table还没add到界面上……
[/Quote]
我上述的代码,每次点第三个Item,都会执行NSLog(@"CollectionView");,但是我就是不知道要怎么刷新,我的想法是说,只要我每次点这个item,那我就重新的初始化这个iten对应视图里的所以视图,比如scrollView,TableView等,但还是没效果。我没有再用_tabbabrcontroller而是直接上了函数中的形参,也不行!
ArthurChen 2011-06-19
  • 打赏
  • 举报
回复
本来想说应该在didselect的时候reload,可以一看吓一跳,每点一次item会alloc一堆然后add上去。。。
这个时候viewcontroller已经在界面上了,直接判断viewcontroller是不是你需要刷新的那个controller
tabbarcontroller就直接用形参了,不需要一个变量_tabbabrcontroller了
还有,这时table还没add到界面上,基本上来说reloadtable只会更新cellinvisible的cell,不过当然datasource已经更新,应该也是会更新的。

29,028

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧