【问题标题】:segmented controller hide segment 0分段控制器隐藏段 0
【发布时间】:2014-10-03 03:15:43
【问题描述】:

我有一个分段控制器,我使用界面生成器制作它看起来像这样

有时我用这个把它设置为四个

[segmentedControl insertSegmentWithTitle:@"Dinner" atIndex:2 animated:YES];
[segmentedControl insertSegmentWithTitle:@"Latenight" atIndex:3 animated:YES];

这很好用,但这是我的问题出现的地方,有时我只想吃早餐和晚餐,深夜但不吃午餐。但是我仍然希望晚餐在索引 2 和深夜在索引 3。所以我拥有的代码不需要根据有多少索引而多次更改。我知道[segmentedControl setEnabled:NO forSegmentAtIndex:0]; 但它看起来不太好,这不是我想要做的吗?

基本上有没有一种方法可以隐藏午餐索引,以便晚餐仍处于索引 2,和/或将晚餐设置为索引 2,即使没有午餐段?

提前感谢您的帮助!!! :)

编辑

-(IBAction)selectMeal:(id)sender{


        switch (((UISegmentedControl *) sender) .selectedSegmentIndex) {
            case 0:
                if ([dayInfo isEqualToString:@"Monday"]) {
                    deliString = @"//day[@name='monday']/meal[@name='LUNCH']/counter[@name='Deli']/dish/name";
                }
             case 1:if ([dayInfo isEqualToString:@"Monday"]) {
                    deliString = @"//day[@name='monday']/meal[@name='Dinner']/counter[@name='Deli']/dish/name";
                }

试过这个:

        indexBreakfast = -1;
        indexLunch = 0;
        indexDinner = 1;
        [segmentedControl removeSegmentAtIndex:indexBreakfast animated:YES];
        [segmentedControl insertSegmentWithTitle:@"Dinner" atIndex:indexDinner animated:YES];

【问题讨论】:

    标签: ios objective-c uisegmentedcontrol


    【解决方案1】:

    请不要使用这种方法。我知道您希望能够知道哪种类型与哪个索引对应而无需查找,但这只是懒惰。

    这是另一种方法。当您确定要显示哪些选项时,存储一个选项数组(包装的枚举值、字符串标题等)。当您的目标动作被触发时,从选定段索引处的数组中获取类型。完毕。

    在你的类中,创建一个属性来存储订单

    @property (nonatomic, strong) NSArray *mealStrings;
    

    然后,当你确定了你想要的餐点和订单后,用值创建一个数组

    self.mealStrings = @[@"Breakfast", @"Lunch"];
    

    ...并初始化UISegmentedControl ...

    self.segmentedControl = [[UISegmentedControl alloc] initWithItems:self.mealStrings];
    

    那么当你需要知道哪一餐时,你可以用

    访问类型
    NSString *mealName = self.mealStrings[self.segmentedControl.selectedSegmentIndex];
    

    【讨论】:

    • 我输入了一个类似的答案。基于可见段的简单查找是一种简单易行的方法。不需要复杂的逻辑。这种方法允许您添加或重新排序段,而无需更改任何其他假定特定索引的代码。
    • 能否发布一个示例代码的 sn-p,请多多指教
    • @daveneedleman 用一些关于如何使用段索引的示例更新您的问题。这样就更容易提供有关如何更改代码的建议。
    • 请注意这个问题是用Objective-C标记的。最好用 Objective-C 而不是 Swift 来提供答案。
    • 哈,我想我的问题很困惑,我以为他发布了一些快速代码。谢谢@rmaddy,现在更新代码。
    【解决方案2】:

    没有办法隐藏段。它必须被删除或禁用。并且由于您要删除段,因此您需要一种很好的方法来处理根据可见段而具有不同含义的段索引。

    一种选择是为每个可能的段定义一个 ivar,并在构建和调整分段控件时将其设置为相应的段索引。

    假设您有四个可能的时段 - 早餐、午餐、晚餐和深夜。添加这四个 ivars:

    NSInteger indexBreakfast, indexLunch, indexDinner, indexLateNight;
    

    现在在构建分段控件时,设置这四个 ivars 以匹配对应段的实际段索引。如果段不可见,则将 -1 分配给 ivar。

    现在你的段处理代码可以是:

    -(IBAction)selectMeal:(UISegmentedControl *)control {
        NSInteger index = control.selectedSegmentIndex;
    
        if (index == indexBreakfast) {
            // handle breakfast
        } else if (index == indexLunch) {
            // handle lunch
        } else if (index == indexDinner) {
            // handle dinner
        } else if (index == indexLateNight) {
            // handle late night
        }
    }
    

    如果您在应用运行时添加、删除或重新排序段,只需更新四个 ivars,其余代码就会执行正确的操作。

    【讨论】:

    • 那么我将设置indexBrekfast = 0 并设置[segmentedControl removeSegmentAtIndex:indexBreakfast animated:YES];,我不太确定将一个设置为-1 的意思是当我不想看到其中之一时细分市场?
    • 如果您删除“早餐”部分,那么您希望在您的 selectMeal: 方法中将 indexBreakfast 设置为 -1. That way the selected segment index won't match indexBreakfast`。当然,您需要将indexLunch 更新为0,因为它现在是第一段,等等。
    • 好的,所以如果我只想要午餐和晚餐,我尝试了我在问题中添加的内容,但它不起作用?我还是有点迷茫?
    • 您需要将我的回答中的switch 语句替换为if-else 语句。
    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多