加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

iphone – UISegmentedControl不更新视图

发布时间:2020-12-14 17:12:31 所属栏目:百科 来源:网络整理
导读:我正在 Xcode 5中构建一个应用程序,我遇到了一些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完全没用.但我想这个代码刚刚添加,因为它不起作用.别忘了删除它;-)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读