gpt4 book ai didi

iphone - UISegmentedControl 不更新 View

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:49 26 4
gpt4 key购买 nike

我在 Xcode 5 中构建一个应用程序,我遇到了 UISegmentedControl 的一些奇怪行为。

首先是关于我正在构建的应用的一些信息:

我正在构建一个应用程序,我希望在其中允许用户在注册公司订购产品。作为一项额外的服务,我想让他们看到他们所做的订单,甚至可以根据订单的状态过滤订单:所有订单、事件订单和已交付订单。订单显示在 UITableView 中,我在标题 View 中创建了一个 UISegmentedControl 来过滤订单。当 UISegmentedControlselectedSegmentIndex 发生变化时,它会执行 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com