2011-02-01 9 views
3

こんにちは私はこの問題を解決するために3週間試しました。私がしようとしているのは、配列から3つの部分のセグメントを作成し、特定の位置のビューに表示し、 "OFF"フラグがセットされているときにビューから削除することです。セグメントの削除以外はすべて動作します。それは(pickOne)と交信し、ラベルにセグメント文字を表示します。私が働くことができないのは、setHidden:YES、またはremoveAllSegmentsのいずれかです。どんな助けもありがとう。ここに私のコードです。SegmentContollerの非表示または移動

- (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]; 
} 

任意の助けいただければ幸いです。

答えて

2

問題は、そのメソッドが呼び出されるたびに新しいUISegmentedControlインスタンスを作成していることです。最初に、インスタンスを作成し、それをサブビューとしてビューに追加します。これは明らかに正常に動作します。メソッドが返され、作成したインスタンスを参照する簡単な方法がなくなりました。 -showSegmentを再入力すると、別のインスタンスのが作成され、非表示または破棄されます。この異なるインスタンスは、ビューに与えたインスタンスには何の影響も与えません。

あなたがする必要があるのは、heightSCをインスタンス変数にすることです。それをヘッダーファイルのインターフェイス宣言に追加し、それを一度だけ初期化し、その後必要に応じて非表示または変更します。要点は、画面上に描画されているUISegmentedControlのインスタンスへの参照、メソッド自体の外部にある参照で、そのメソッドを呼び出す2番目、3番目、4番目などの時間を使用できることです。

-1
[yourSegment removeFromSuperview]; 

+0

私はそれを試してみた、あなたはあなたのコードでクラッシュアウトとスーパービューからサブビューを削除することはできません。これを行う方法はありますが、ビュー全体が削除されます。私がしたいのは、それを取り除かないセグメントを隠すことだけです。あなたの応答に感謝します。 – hodji

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]; 

     } 
    } 
+0

それはうまくいくだろうが、私はそれを見ることのできないボタンをクリアしたい。すなわち、それが表示される前にまたは直後に見ること。とにかくあなたの助言に感謝します。 – hodji

0

私はこれを試して、私が探していた結果を得ました。ありがとうMythogenとBrianSlickに行く私はちょうどそこに漏れがないことを確認し、確認する必要があります。今それは仕事になるでしょう。

私は2番目の[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]; 
} 
関連する問題