- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 Xcode 5 中构建一个应用程序,我遇到了 UISegmentedControl
的一些奇怪行为。
首先是关于我正在构建的应用的一些信息:
我正在构建一个应用程序,我希望在其中允许用户在注册公司订购产品。作为一项额外的服务,我想让他们看到他们所做的订单,甚至可以根据订单的状态过滤订单:所有订单、事件订单和已交付订单。订单显示在 UITableView 中,我在标题 View 中创建了一个 UISegmentedControl
来过滤订单。当 UISegmentedControl
的 selectedSegmentIndex
发生变化时,它会执行 NSPredicate
来过滤数组并仅显示所需的订单。
现在一切正常,除了一件事:当我选择另一个段时,我拥有的 UISegmentedControl
不会更新它的 View 。默认的 selectedSegmentIndex
是 'Active
',因为用户可能对事件订单最感兴趣,但是当我将它更改为 'All' 时,tableview 显示所有订单(所以谓词有效),但 View 保持在相同的 selectedSegmentIndex
上。
我做了很多研究来解决这个问题但没有答案解决我的问题..我的代码:
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
if(section == 0) {
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f,0.0f, 320, 45)]; // x,y,width,height
//label
UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320, 20)];
title.text = @"Kies een filter...";
[headerView addSubview:title];
//segmentedcontrol
NSArray *itemArray = [NSArray arrayWithObjects: @"Alle", @"Actief", @"Afgehandeld", nil];
control = [[UISegmentedControl alloc] initWithItems:itemArray];
[control setFrame:CGRectMake(0.0f, 20.0f, 320.0, 35.0)];
control.userInteractionEnabled = YES;
control.tintColor = [UIColor blackColor];
[control setEnabled:YES];
[control addTarget:self action:@selector(changeFilter:) forControlEvents:UIControlEventAllEvents];
[headerView addSubview:control];
//label containing selected filter info
UILabel *info = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 55.0f, 320, 20)];
if ([selectedFilterInfo isEqualToString:@"Alle"]) {
info.text = @"Alle orders:";
}
else if ([selectedFilterInfo isEqualToString:@"Actief"]) {
info.text = @"Alle actieve orders:";
}
else if ([selectedFilterInfo isEqualToString:@"Afgehandeld"]) {
info.text = @"Alle afgehandelde orders:";
}
[headerView addSubview:info];
headerView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bar.png"]];
return headerView;
}
}
及其触发的 Action :
- (void)changeFilter:(id)sender {
UISegmentedControl *segmentedControl = (UISegmentedControl *)sender;
if (segmentedControl.selectedSegmentIndex == 0) {
selectedFilterInfo = @"Alle";
filteredArray = nil;
[segmentedControl reloadInputViews];
[segmentedControl setSelectedSegmentIndex:0];
}
else if (segmentedControl.selectedSegmentIndex == 1) {
NSPredicate *deliveredpredicate = [NSPredicate predicateWithFormat:@"SELF.delivered contains[c] %@", @"0"];
NSMutableArray *notDeliveredArray = [NSMutableArray arrayWithArray:[sortedArray filteredArrayUsingPredicate:deliveredpredicate]];
filteredArray = [NSMutableArray arrayWithArray:notDeliveredArray];
selectedFilterInfo = @"Actief";
[segmentedControl reloadInputViews];
[segmentedControl setSelectedSegmentIndex:1];
}
else if (segmentedControl.selectedSegmentIndex == 2) {
NSPredicate *deliveredpredicate = [NSPredicate predicateWithFormat:@"SELF.delivered contains[c] %@", @"1"];
NSArray *deliveredArray = [sortedArray filteredArrayUsingPredicate:deliveredpredicate];
filteredArray = [NSMutableArray arrayWithArray:deliveredArray];
selectedFilterInfo = @"Afgehandeld";
[segmentedControl reloadInputViews];
[segmentedControl setSelectedSegmentIndex:2];
}
[self.tableView reloadData];
我没有包括 numberOfCellsInSection
等等,因为 tableview 部分工作正常。唯一不起作用的是更新 View 。
任何解决方案将不胜感激,提前谢谢大家!!
最佳答案
reloadData 将重新加载 tableView,当您重新加载 tableView 时,所有 headerView 也将被重新加载。当 tableView 重新加载时,有一个新的标题。而且你现在看到的UISegmentedControl并不是你点击的那个。
创建一个包含您选择的索引的 ivar
@implementation .. {
NSInteger selectedIndex;
}
创建 View 时恢复保存的索引
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
/* ... */
control = [[UISegmentedControl alloc] initWithItems:itemArray];
control.selectedSegmentIndex = selectedIndex;
/* ... */
}
改变segmentedControl时保存索引
- (void)changeFilter:(id)sender {
UISegmentedControl *segmentedControl = (UISegmentedControl *)sender;
selectedIndex = segmentedControl.selectedSegmentIndex;
if (segmentedControl.selectedSegmentIndex == 0) {
selectedFilterInfo = @"Alle";
filteredArray = nil;
}
/* ... */
// reloads the table and all header views!
[tableView reloadData];
}
顺便说一句。当您使用 UISegmentedControls 时,无需再次对其调用 setSelectedSegmentIndex:
,点击已经设置了索引。并且 reloadInputViews 对于 UISegmentedControl 完全没用。但我猜这段代码是因为它不起作用才刚刚添加的。不要忘记将其删除 ;-)
关于iphone - UISegmentedControl 不更新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18588941/
根据以下文档 ( https://developer.apple.com/documentation/uikit/uisegmentedcontrol/1618570-settitletextattr
我试图在登录时隐藏 nameTextField 并使其在注册时显示切换。我一直试图自己解决这个问题,但这就是我所得到的。我已经把它归结为两个错误,它们是相同的。 Issue Navigator laz
我有两个 UISegmentedControl,我想用其中一个来启用/禁用另一个。我编写了一个函数来处理这个问题,如下所示: - (void)disableSegment2 { if (
我有一个以编程方式定义的 UISegmentedControl。 我正在尝试添加布局约束,以便当我的 iPad 旋转时,分段控件在旋转 View 中正确调整大小,而不是溢出屏幕。 我应用了以下约束:
如何通过再次按下同一段来取消选择 UISegmented 控件中的给定段? 例如按下段 0,它将被选中并保持突出显示。再次按下段 0,它将变为未选中且未突出显示。 该控件仅触发 UIControlEv
我正在为我的分段控件设置颜色,如下所示: segmentedControl.backgroundColor = .gray segmentedControl.selectedSegmentTintCo
我在 iOS7 中更改分段控件的边框颜色时遇到问题。我在 stackoverflow 的其他地方找到了以下建议: [[UISegmentedControl appearance] setTit
是否可以让 UISegmentedControl 在 iPhone 上跨越两行?我已经在一些应用程序中看到了这一点,但没有在文档中找到我需要的内容。也许它是一个自定义的 UIButton,设计得像 U
我的应用程序中有一个 UISegmentedControl(请参阅下面的代码): // --------------- SETTING NAVIGATION BAR RIGHT BUTTONS NSA
我的 iPhone 应用程序中有一个分段控件,在 ios6 上运行良好,但在 ios7 上,分段图 block 被截断(有足够的空间容纳文本,但无论如何都会截断它们) self.segment
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: How to change font color of UISegmentedControl 是否可以为 selec
有没有办法通过编程使UIsegmentedControl具有方角?请帮忙!!! 最佳答案 您可以为将完全覆盖边框的片段设置背景图像。如果背景图像是方形的,那么分段控件将显示为方形。对您想要自定义的每个
如何制作多行 UISegmentedControl。我需要它有 6 个按钮,每行 3 个。我如何以编程方式执行此操作? 最佳答案 您将需要使用其中两个,并使用 selectedSegmentIndex
我正在使用带有一些自定义图像的 UISegmentedControl: UISegmentedControl *segmentedControl = [[UISegmentedControl allo
有没有办法摆脱 UISegmentedControl 的圆角或者它是默认行为? 最佳答案 有一些非常简单的方法可以让您摆脱 UISegmentedControl 上的圆形垃圾...将样式更改为“7”。
就像标签栏一样,我想在 UISegmentedControl 上显示徽章。因为我看不到 UISegmentedControl 的任何预定义方法,就像可用于 UITabBar 的方法一样。 我考虑过将徽
如何获得一个类似于邮件应用程序中的 UISegmentedControl,以便它与 UIToolbar 按钮颜色相同(就好像两个段都处于选定状态一样)。 我想使用分段控件来实现与 Mail 完全相同的
这可能是一个非常简单的问题,但我似乎无法在 API 或任何搜索引擎中找到任何内容。 我有一个分段控件,我已将其设置为瞬时,因为用户将选择他们想要搜索的几个汽车品牌。我遇到的问题是我似乎无法弄清楚如何识
当我将整个导航栏设置为黑色时,通常在所选按钮上的 UISegmentedControl 上显示的色调不会显示(self.navigationController.navigationBar.tintC
我想为 UISegmentedControl 提供以下方面: 注意灰色背景 View ,以及分段控件未选定项目的白色背景。 但是,如果我为 UISegmentedControl 提供白色背景,我会得到
我是一名优秀的程序员,十分优秀!