Jor*_*416 3 iphone xcode objective-c uitableview uisegmentedcontrol
我正在Xcode 5中构建一个应用程序,我遇到了一些奇怪的行为UISegmentedControl.
关于我正在构建的应用程序的一些信息:
我正在构建一个应用程序,我希望允许用户在注册公司订购产品.作为额外的服务,我想让他们看到他们做的订单,甚至过滤他们的状态订单:所有订单,活动订单和已下达的订单.订单显示在UITableView中,我在UISegmentedControl标题视图中创建了一个过滤订单.当selectedSegmentIndex它UISegmentedControl发生变化时,它会执行一个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, 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;
}
}
Run Code Online (Sandbox Code Playgroud)
以及它触发的动作:
- (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];
Run Code Online (Sandbox Code Playgroud)
}
我没有包括numberOfCellsInSection等等,因为tableview部分工作正常.唯一不起作用的是更新视图.
任何解决方案都会非常感激,谢谢大家!
reloadData将重新加载tableView,当你重新加载tableView时,所有的headerViews也会重新加载.重新加载tableView时,会出现一个新标头.你现在看到的UISegmentedControl并不是你用过的那个.
创建一个包含所选索引的ivar
@implementation .. {
NSInteger selectedIndex;
}
Run Code Online (Sandbox Code Playgroud)
创建视图时还原已保存的索引
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
/* ... */
control = [[UISegmentedControl alloc] initWithItems:itemArray];
control.selectedSegmentIndex = selectedIndex;
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
更改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];
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下.当你使用UISegmentedControls时,不需要setSelectedSegmentIndex:再次调用它,tap已经设置了索引.并且reloadInputViews对于UISegmentedControl完全没用.但我想这个代码刚刚添加,因为它不起作用.别忘了删除它;-)
| 归档时间: |
|
| 查看次数: |
1703 次 |
| 最近记录: |