隐藏或移动SegmentContoller

时间:2011-02-01 18:07:54

标签: iphone ios4

您好我已经尝试了3个星期来解决这个问题,它让我很难过。我要做的是从数组创建一个3部分段,在某个位置的视图中显示它,然后在设置“OFF”标志时将其从视图中删除。除了删除段之外,每件事都有效。它甚至可以与(pickOne)交换并在标签中显示段字母。我无法工作的是两者之一:setHidden:YES或removeAllSegments。任何帮助,将不胜感激。这是我的代码。

- (void) showSegment {

    int x = 192; 
    int y = 212;

    int w = 125;
    int h = 25;

    SegUnit1 = @"A";
    SegUnit2 = @"B";
    SegUnit3 = @"C";

    threeSegs = [NSArray arrayWithObjects: SegUnit1, SegUnit2, SegUnit3, nil];  
    segSize = [NSArray arrayWithArray:threeSegs];

    UISegmentedControl *heightSC = [[UISegmentedControl alloc] initWithItems:segSize];  

    if ([segmentState_height isEqualToString:@"ON"]) {

        NSLog(@"segmentState_height = %@",segmentState_height); 
        heightSC.frame = CGRectMake(x, y, w, h);    
        heightSC.segmentedControlStyle = UISegmentedControlStyleBar;
        heightSC.selectedSegmentIndex = -1;
        [heightSC addTarget:self
                     action:@selector(pickOne:)
           forControlEvents:UIControlEventValueChanged];
        [self.view addSubview:heightSC];
        [heightSC release]; 
    }   else if ([segmentState_height isEqualToString:@"OFF"]) {

        NSLog(@"segmentState_height = %@",segmentState_height);
        [heightSC setHidden:YES]; // NSLog showing "OFF" but segment will not hide. 
        [heightSC removeAllSegments]; // NSLog showing "OFF" and segment is suppose to dismantle and does not.

    }
}

我现在知道我必须“不”在相同的功能中创建和删除,并且给出了纠正此提示的提示,但我不知道如何使用提示。

这是建议的内容。

嗯,你的方法有点困惑,因为你试图同时创建和隐藏。因此,您可以考虑将其拆分为单独的方法。

总的来说,它将沿着这些方向发展:

代码:

if ([self theControlProperty] == nil)
{
    UISeg... *theControl = [[UISeg alloc] ....];

    [self setTheControlProperty:theControl];

    ...

}

if (shouldHideTheControl)
{
    [[self theControlProperty] setHidden:YES];
}

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:2)

您遇到的问题是每次调用该方法时都要创建一个新的UISegmentedControl实例。第一次,您创建一个实例并将其作为子视图添加到您的视图中。这显然工作正常,应该如此。然后该方法返回,您不再有任何简单的方法来引用您创建的实例。当您重新输入-showSegment时,您将创建一个不同的实例,然后隐藏和/或销毁它。这个不同的实例对您给视图的实例没有任何影响。

您需要做的是使heightSC成为一个实例变量。将其添加到头文件中的接口声明中,然后只初始化一次,然后根据需要隐藏或修改它。关键点是你需要引用屏幕上绘制的UISegmentedControl实例,这个引用位于方法本身之外,你可以使用你调用该方法的第二,第三,第四等时间

答案 1 :(得分:0)

尝试在按钮选择方法pickOne中使用删除段。这将它带到showSegment方法之外,并匹配用户所需的操作以进行更改并清除按钮。

- (void) pickOne:(id)sender {

    UISegmentedControl* userChose = sender; 

    if( [userChose selectedSegmentIndex] == 0 ){

        your first button operation;
        [heightSC removeAllSegments];
    }

    if( [userChose selectedSegmentIndex] == 1 ){

        your second button operation;
        [heightSC removeAllSegments];

        }   
    if( [userChose selectedSegmentIndex] == 2 ){

        your third button operation;
        [heightSC removeAllSegments];

        }
     }

答案 2 :(得分:0)

我试过这个并得到了我想要的结果。谢谢Mythogen和BrianSlick我只需要检查并确保没有泄漏。现在这将是一项任务。

有人知道我是否需要第二个[heightSC release];

// .h

@ interface ------ {
UISegmentedControl *segmentPicked;
}

|

@property (nonatomic, retain) UISegmentedControl *segmentPicked;

// .m

|

@synthesize segmentPicked;

|

if ([self segmentPicked] == nil) {

    UISegmentedControl *heightSC = [[UISegmentedControl alloc] initWithItems:segSize];  
    [self setSegmentPicked:heightSC];
    [heightSC release]; 
    heightSC.frame = CGRectMake(x, y, w, h);    
    heightSC.segmentedControlStyle = UISegmentedControlStyleBar;
    heightSC.selectedSegmentIndex = -1;
    [heightSC addTarget:self
    action:@selector(pickOne:)
    forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:heightSC];
    [heightSC release];
}

if ([segmentState_height isEqualToString:@"OFF"])
{
    [[self segmentPicked] setHidden:YES];
} else {
    [[self segmentPicked] setHidden:NO];
}

答案 3 :(得分:-1)

[yourSegment removeFromSuperview];