2009-07-22 13 views
1

私は確かにここで完全に愚かな何かをしている、うまくいけば誰かが私に何を言うことができる!要約すると、ボタン(私は分割されたボタンを使用します)がクリックされると、サブビューをプログラム的に切り替えることができます。アニメーション化する必要はありません。理想的には、これらのビューの内容をペン先からロードします。UIViewのサブビューを動的に設定する方法(iPhone)

nibから初期化されたUIViewControllerサブクラスをnavigationControllerにプッシュします。このビューコントローラ& "default"ビューが表示されます。このペン先には次のものが含まれています:

File's Owner [Class=my view controller subclass] 
First Responder 
View 
--Bar Segmented Control 
--View //this is the 'subview' whose content I want to toggle 

おそらく自分のIBアウトレットで間違いを犯しましたか?

switchableView <--> View 
view <--> View 

、どこswitchableViewが宣言されています:

IBOutlet UIView *switchableView; 
... 
@property (nonatomic, retain) UIView *switchableView; 

私はこれのUIViewの内容を置き換えで立ち往生していますが、次のように彼らがフックアップされています。まず、ビューが最初に生まれたらデフォルトに設定したいだけです。一度私がそれを持っている、私はすでにセグメント化されたボタンによって生成されたイベントをキャプチャすることができますので、他のものに交換するのは簡単でなければなりません。誰かが私が間違っていることを教えてもらえますか?

- (void)loadView { 
NSLog(@"loadView invoked"); 
[super loadView]; 
UIView *view = [[UIView alloc] init]; 
UILabel *label = [[UILabel alloc] init]; 
label.text = @"Segment1"; 
[view addSubview:label]; 
[switchableView addSubview:view]; //this is what I can't work out 
[view release]; 
[label release];  
} 

viewDidLoadのように)、どちらも助けメソッドが呼び出さされていること。私は[switchableView addSubview:view]が間違っていると思います。私もswitchableView = viewを試しましたが、JavaとPerlの安全性に長い時間をかけて、試してみるかしないかは100%わかりません!

誰かが私を真っ直ぐにしてくれることを願っています。おかげさまで、

ポール

答えて

3

。以下の作品:

- (void)loadView { 
    [super loadView]; 

    //define what will go in the seg1 view 
    UILabel *mylabel = [[UILabel alloc] initWithFrame:switchableView.frame]; 
    [email protected]"finally"; 
    self.seg1view = [[[UIView alloc] initWithFrame:switchableView.frame] autorelease]; 
    [self.seg1view addSubview:mylabel]; 
    [mylabel release]; 

    //define what will go in the seg2 view 
    UILabel *mylabel2 = [[UILabel alloc] initWithFrame:switchableView.frame]; 
    [email protected]"it works!"; 
    self.seg2view = [[[UIView alloc] initWithFrame:switchableView.frame] autorelease]; 
    [self.seg2view addSubview:mylabel2]; 
    [mylabel2 release]; 

    //default the switchable view to seg1view 
    [switchableView addSubview:self.seg1view]; 
} 

-(void)doTheSwitch { 
    if (segmentedButton.selectedSegmentIndex == 0) { 
     [seg2view removeFromSuperview]; 
     [switchableView addSubview:seg1view]; 
    } 
    if (segmentedButton.selectedSegmentIndex == 1) {  
     [seg1view removeFromSuperview]; 
     [switchableView addSubview:seg2view]; 
    } 
} 
次はまた性質(保持、非アトミック)のように定義されている

IBOutlet UIView *switchableView; 
UIView *seg1view; 
UIView *seg2view; 
+0

ちょうどFYI: "このメソッドのカスタム実装はsuperを呼び出すべきではありません。 http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/loadView –

0

ここにいくつかの抜粋があります。最初はナビゲーションコントローラの初期化だけです

// In AppDelegate.m 
-(void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    // Create and configure the main view controller. 
    UIViewController *firstViewController = [[UIViewController alloc] init]; 

    // Add create and configure the navigation controller. 
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:firstViewController]; 
    self.navController = navigationController; 
    [navigationController release]; 

    // Configure and display the window. 
    [window addSubview:navController.view]; 
    [window makeKeyAndVisible]; 
} 

次に、新しいビューの準備ができたら、そこに1つを押してください。

// Wherever you need to get your new view on there 
UIViewController *secondViewController = [[UIViewController alloc] init]; 
[[self navigationController] pushViewController:secondViewController animated:YES]; 
[secondViewController release]; 

実際にiPhoneの世界に流暢になるためには、1日に約5つのAppleサンプルプロジェクトを行ってください。初心者はTableSearchです。

+0

乾杯が、これは私が後だものではありません。私はすでにビューコントローラを持っていますが、すでにビューを表示しています - 新しいビューコントローラをスタックにプッシュしたくありません。私がしたいことは、ビューコントローラを利用して、私のビューに埋め込まれているサブビューをスワップアウトすることです。 –

0

最も可能性の高い問題は、ビューにフレームを設定していないことです。つまり、正常にアタッチされている間に、フレームのサイズは0x0です。それは(UILabelは、UIViewのあるあなたは、その完全なフレームをカバーし、単一のサブビューが、何もない2そのうち3つのビューを積層し、無償であったため

- (void)loadView { 
    NSLog(@"loadView invoked"); 
    [super loadView]; 

    CGRect labelFrame = CGRectZero; 
    labelFrame.size.height = switchableView.size.height; 
    labelFrame.size.width = switchableView.size.width; 

    UILabel *label = [[UILabel alloc] initWithFrame:labelFrame]; 
    label.text = @"Segment1"; 
    [switchableView addSubview:label]; //this is what I can't work out 
    [label release];  
} 

も削除ビュー:

のようなものを試してみてください。 )、それはUIViewControllerビューのプロパティを省略しました(通常、インスタンス変数やプロパティと同じ名前のローカル変数を作成するのは悪いですが、それを避けるためにオンにできるコンパイラの警告があります)。

0

私はあなたの質問を正しく理解している場合、別のビューと入れ替えることを試みています。これを達成する1つの方法は、次のとおりです。

switchViewという名前のルートビューにUIViewを追加します。コードまたはInterface BuilderでsubView1という名前の新しいUIViewのを作成したときにルートビュー負荷のSwitchViewのサブクラスとして追加し、次のいずれか

[switchView addSubview:subView1];

をユーザーがルートビューにセグメント化された制御を切り替えた場合、新しいのUIViewを作成しますsubView2という名前の同様の方法でとのSwitchViewの現在のサブビューでそれを切り替える:(私はいくつかのポインタを与えるために、あなたの両方のおかげで)UICatalogサンプルコードを検査した後、最後にこれを解決

[subView1 removeFromSuperview]; 
[switchView addSubview:subView2];
関連する問題