我希望使用UISegmentedControl在同一视图上的两个表之间进行切换。一个表(加载视图时的默认值)被分组。第二个表应该是普通的(非分组的)。 tableView在xib中设置为Grouped。
现在,当我在两组数据之间进行翻转时,我正在执行reloadData。所以当然两个“视图”都是分组的样式。我知道一旦设置就无法改变tableView的样式,但我希望模仿这种意图。
我最好的想法是在代码中创建第二个(普通)tableView,然后根据需要在两者之间切换。我可以显示/隐藏(将它们保存在内存中)或者从superView中添加和删除。
两个视图都可能导致用户点击其他推送的viewControllers。我希望保持与链的一致性,包括从链接下游的viewControllers中获取popToRootViewController的能力(所讨论的视图是从根目录向下两三步)。
在我用这个想法撕掉我的代码之前,我想我会去看看别人的想法。
谢谢!
更新:到达那里。当我想显示普通表视图时,我有这个:
PlainViewController *plainViewController = [[PlainViewController alloc] init];
UIView *plainTableView = plainViewController.view;
plainTableView.frame = CGRectMake(320, 0, 320, 480);
[self.view addSubview:plainViewController.view];
加载并显示正常。但是当PlainViewController的didSelectRowAtIndexPath
触发时,它无法加载下一个视图。 didSelectRowAtIndexPath
正在解雇(已记录),但pushViewController
什么也没做;下一个视图的viewDidLoad永远不会触发。
我怀疑NavigationController中存在不连续性,但不太确定在哪里修复它。
答案 0 :(得分:1)
您可以创建单独的UIViewController
并将其表格添加到“主要”视图中。
PlainTableViewController *ctr = [[PlainTableViewController alloc] init];
[self.view addSubview:ctr.view];
[ctr release];
您还可以轻松设置此流程的动画:
PlainTableViewController *ctr = [[PlainTableViewController alloc] init];
UIView *plainTableView = ctr.view;
plainTableView.frame = CGRectMake(320, 0, 320, 480);
[self.view addSubview:plainTableView];
[UIView animateWithDuration:0.3
animations:^{
groupedTableView.frame = CGRectMake(-320, 0, 320, 480);
plainTableView.frame = CGRectMake(0, 0, 320, 480);}
completion:^(BOOL finished){[groupedTableView removeFromSuperView];}
];
[ctr release];
注意:您不要在导航控制器中将其添加为视图控制器,因此popToRootViewController
的所有调用都应该导致您的“主”viewController。这就是你想要的。
答案 1 :(得分:1)
将tableViewStyle
分配给- (void) refreshTable;
之类的内容,然后点按segmentedControl,同时拨打[myTable reloadData];
答案 2 :(得分:1)
您可以使用两个不同的视图,这些视图具有样式但具有相同数据的表,并且您可以在段选择索引更改事件上翻转这两个视图
OR
您必须从超级视图中删除该表,然后使用所选样式重新分配表,并将其再次添加到该视图中。
答案 3 :(得分:0)
我认为从包含分段控件的视图中添加/删除表视图应该可以无缝地工作。
为了保持一致性,我认为该方法存储的信息是关于通过分段控件选择哪个视图,因此当您显示该视图时,您知道哪个是当前样式。此信息也将存储在NSUserDefaults中,以便在运行期间保持不变。
答案 4 :(得分:0)
简单,每次分段控件更改时,重新创建UITableView。 好处:免于编写太多代码和内存。 下行:使用更多的CPU。
但是无论如何你都要用reloadData重绘视图,所以只需重新创建视图就是一个非常小的CPU耗尽。
-(void)segmentedControlChanged{
CGRect originalFrame = tableView.frame;
UITableViewStyle tableStyle;
if(selectedSegmentIndex == 0){
tableStyle = UITableViewStylePlain;
} else {
tableStyle = UITableViewStyleGrouped;
}
[tableView removeFromSubview];
tableView = [[UITableView alloc] initWithFrame:originalFrame style:tableStyle];
tableView.delegate = self;
tableView.dataSource = self;
[self.view addSubview:tableView];
}
注意:内存写入的代码没有签入Xcode。