iphone – UISegmentedControl不更新视图
我正在
Xcode 5中构建一个应用程序,我遇到了一些UISegmentedControl的奇怪行为.
关于我正在构建的应用程序的一些信息: 我正在构建一个应用程序,我希望允许用户在注册公司订购产品.作为一项额外的服务,我想让他们看到他们所做的订单,甚至过滤订单的状态:所有订单,有效订单和交付订单.订单显示在UITableView中,我在标题视图中创建了一个UISegmentedControl来过滤订单.当该UISegmentedControl的selectedSegmentIndex发生更改时,它会执行NSPredicate来过滤数组并仅显示所需的顺序. 现在它工作得很好,除了一件事:当我选择另一个段时,我没有更新它的视图的UISegmentedControl.它的默认selectedSegmentIndex是’Active’,因为用户可能对活动订单最感兴趣,但当我将其更改为’All’时,tableview显示所有订单(因此谓词正在运行),但视图仍保留在相同的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,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,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; } } 以及它触发的动作: - (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部分工作正常.唯一不起作用的是更新视图. 任何解决方案都会非常感激,谢谢大家! 解决方法
reloadData将重新加载tableView,当你重新加载tableView时,所有的headerViews也会重新加载.重新加载tableView时,会出现一个新标头.你现在看到的UISegmentedControl并不是你用过的那个.
创建一个包含所选索引的ivar @implementation .. { NSInteger selectedIndex; } 创建视图时还原已保存的索引 - (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:tap会设置索引.并且reloadInputViews对于UISegmentedControl完全没用.但我想这个代码刚刚添加,因为它不起作用.别忘了删除它;-) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |