3

私は現在、ビューコントローラのviewDidLoadメソッドでUISegmentedControlをプログラムで作成し、ビューコントローラのナビゲーションバーにself.navigationItem.titleViewに割り当てて追加しています。IBを使用してUISegmentedControlをNavigationBarに追加する

これは簡単ですが、Interface Builderでもこれを実行できるようにしたいと考えており、これまでのところどのように把握できていません。 Googleはあまり役に立ちませんでした。 IBでこれを行う方法やオンラインの例を指摘する人はいますか?私はとても感謝しています。 おかげで、 ハワード

+0

こんにちは!私はこれに関して1つの問題があります!私は1つのsegmentControlを持っており、それをnavigationControllerに追加したいと思います。どうやって ? – Chintan

答えて

6

ペン先に完全なnavスタックがある場合は、実際にはかなり簡単です。タイトルエリアにドラッグするだけで、IBが自動的に適切なことを行うことができます。

それ以外の場合は、分割されたコントロールを(必ずしもサブビューではない)ペン先に追加してから、ビューコントローラから@property IBOutletを追加することができます。次に、viewDidLoadで、通常のようにtitleViewに割り当てます。 deallocでリリースすることを覚えていれば、あなたは金色です。

+0

第2段落の名誉、アンドリュー:私はそれがさらに好きです。質問tho:私は第1段落であなたが何を言っているのか理解していません。 *タイトル*に何を正確にドラッグしますか? – hkatz

+0

彼はナビゲーションベースのアプリケーションを持っている場合、メインのwindow.nibにそこにSegmentedControlをドラッグすることができ、それはビュースタックのために持続することを意味します。 – JamesSugrue

0

あなたはIBでtitleViewプロパティを設定することはできませんが、Interface Builderを経由して、コントローラのビューの子としてコントロールを設定/作成することができるかもしれないし、お使いviewDidLoad方法では、あなたのビューから削除し、titleViewとしてそれを設定してください:

[segControl removeFromSuperview]; 
self.navigationItem.titleView = segControl; 
+0

これは面白いアイデアです.IBで何かを作成し、後でアクセスできるようにするために何かのサブビューとして残してから、ポインタをつかんでviewDidLoadのビュー階層を修正します。ドキュメントには、removeFromSuperviewがレシーバを解放するという興味深い小さなメモがあります。そうする前に、最初に保持する必要があります(titleViewに割り当てた後に再度解放する必要はありません。 titleViewプロパティはセマンティクスを保持しており、あなたのためにリリースを行います)。 – hkatz

1

IBでは、ナビゲーションコントローラの中央にビューをドラッグするだけで、ナビゲートアイテムの内側に表示されていれば問題ありません。

しかし、同じビューオブジェクトリファレンスが、ある時点でナビゲーションコントローラスタックにプッシュされる異なるナビゲーションアイテムのタイトルビュー領域にドラッグされた場合、あなたが戻ったときにタイトルビューが消える問題が発生しますスタックを介して。ナビゲーションコントローラは何らかの理由で複数のナビゲーションアイテム上にポップアップしている同じオブジェクトへの参照があまりにも幸せではなく、面倒なナビゲーションアイテムでビューにポップアップしたときにしかフィットしません。

これを回避するには、共有タイトルビューオブジェクト参照を使用してビューにナビゲートするときに、titleViewオブジェクトを明示的に設定および設定解除する必要があります。たとえば、サブクラス化されたビューの背後にあるカスタムロジックが、一度だけインスタンス化したいtitleViewとして設定されていたとします。

1

また、IBで設計されたUISegmentedControlを独自のNIBに保存することもできます。次に、FileOwnerをsegmentedControlインスタンスを使用するviewcontrollerクラスに設定します。 viewcontrollerクラスでは、segmentedcontrolをIBOutletプロパティとして宣言し、それをペン先のインスタンスにリンクします。設計されたインスタンスを使用して、左

すべてを呼び出すために、その後です:

[[NSBundle mainBundle] loadNibNamed:@"TTCustomSegmentedControl" 
           owner:self 
          options:nil]; 
self.navigationItem.titleView = sortSegmentControl;  
1

ただ、これは(私のために動作します)してみてください:

UISegmentedControl *mSegmentedControl = [[UISegmentedControl alloc] initWithItems: 
              [NSArray arrayWithObjects: 
              @"Segment 1", 
              @"Segment 2", 
              nil]]; 

mSegmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; 
mSegmentedControl.tintColor = [UIColor redColor]; 

[mSegmentedControl setSelectedSegmentIndex:0]; 


[mSegmentedControl addTarget:self action:@selector(sectionPress:) 
      forControlEvents:UIControlEventValueChanged]; 

self.navigationItem.titleView = mSegmentedControl; 
関連する問題