通过分段控制在标准和分组样式表之间翻转

时间:2011-07-29 18:02:15

标签: iphone uisegmentedcontrol uitableview

我希望使用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中存在不连续性,但不太确定在哪里修复它。

5 个答案:

答案 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。