1

次のように、viewDidLoadメソッド内にセグメント化されたコントロールを構築しています。

NSArray *tabitems = [NSArray arrayWithObjects:@"ONE", @"TWO", nil];
UISegmentedControl *tabs = [[UISegmentedControl alloc] initWithItems:tabitems];
tabs.segmentedControlStyle = UISegmentedControlStyleBar;
tabs.frame = CGRectMake(185.0, 7.0, 130.0, 30.0);
tabs.selectedSegmentIndex = 0;
[self.navigationController.navigationBar addSubview:tabs];
[tabs release];

ただし、ユーザーがuinavigationcontroller階層に戻ると、セグメント化されたコントローラーはナビゲーションバーに留まります。どうすればそれを取り除くことができますか?それとも私は根本的に間違ったことをしていますか?


編集

Alexの提案に従って、タブを適切化して試しました。

  NSArray *tabItems = [NSArray arrayWithObjects:@"FAQs", @"Terms", nil];
  self.tabs = [[UISegmentedControl alloc] initWithItems:tabItems];

しかし、プロパティを割り当てるのが良い考えかどうかはわかりません。

そして、私は使用しています

  [self.tabs removeFromSuperview];

私の見解では消えます。それで十分?

4

2 に答える 2

2

ビューコントローラでセグメント化されたコントロールへの参照を保持します(つまりtabs、ビューコントローラのヘッダーファイルでプロパティとして定義します)。

ビューコントローラの-viewWillDisappear:メソッドをオーバーライドし、コントロールのメソッドを使用して、セグメント化されたコントロールをナビゲーションバーから削除します-removeFromSuperview

編集

alloc-initでセグメント化されたコントロールtabsを引き続き使用できます-viewDidLoadtabsビューコントローラのヘッダーにretainプロパティを設定し、コントロールのreleaseステートメントをビューコントローラのdeallocメソッドに移動する必要があります。

プロパティの概要とその設定方法については、このObjective-Cチュートリアルの「プロパティ」セクションをお読みください。

メソッドをオーバーライドする方法は次のとおりです。

- (ReturnClass) methodNameToOverride:args {
    [super methodNameToOverride:args];
    // your code goes here...
}

の場合-viewWillDisappear:、このメソッドは、ナビゲーションスタックからポップされたときなど、ViewControllerが消えようとしているときに呼び出されます。これは、セグメント化されたコントロールなど、ビューコントローラ固有のアイテムのクリーンアップを管理するコードを配置するのに最適な場所です。

- (void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [tabs removeFromSuperview];
}

編集2

プロパティが次のように設定されている場合:

@property (nonatomic, retain) UISegmentedControl *tabs;

次に、あなたが等しくretain設定したものに行きます。self.tabs

ここにあなたのコード:

self.tabs = [[UISegmentedControl alloc] initWithItems:...];

このオブジェクトを保持しているため、メモリリークが発生します:[[UISegmentedControl alloc] init]—ただし、それ自体を解放することはありません[[UISegmentedControl alloc] init]。これは悪いです。

代わりにautorelease、右側で使用します。つまり、次のようになります。

self.tabs = [[[UISegmentedControl alloc] initWithItems:...] autorelease];

プロパティは、初期化されたセグメント化されたコントロールへのtabs独自の参照を保持します。その初期化されたセグメント化された制御自体は、後の時点で適切に解放されます。したがって、メモリリークはもうありません。

于 2010-05-18T09:56:29.097 に答える
0

さらに良いことに、UISegmentedControlが所有するUIViewControllerのnavigationItem.titleViewをUISegmentedControlに設定します。

-(void) viewDidLoad {
    if(!mySegmentedControl) {
        // initialize the UISegmentedControl
        ...
    }

    self.navigationItem.titleView = mySegmentedControl; 
}

もちろん、UIViewControllerの所有権が解放されたときに解放する場合を除いて、UISegmentedControlまたはその他のUIViewを手動で削除する必要はありません。また、「良い記憶の市民」になるために、あなたはあなたの財産をnilに設定するかもしれません-viewDidUnload

UIViewControllerのnavgiationItemの左右のbarButtonItemsをカスタマイズすることもできます。

于 2010-11-23T18:05:47.440 に答える