您好我已经尝试了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];
}
任何帮助都将不胜感激。
答案 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];