3

アプリケーションにUIViewを追加しようとしています。動作しますが、期待どおりではありません。ヘッダーでsocialActionViewを定義し、ビューコントローラーで@synthesizeを作成しました。

ユーザーがボタンをタブで押すと、nibファイルがロードされます。ビューを表示するには、addSubview-methodを呼び出す必要があると思いました。しかし、それは私がそれをしない場合でも現れます。

とにかくaddSubViewメソッドを呼び出すと、「警告:以前に選択したフレームを復元できません」というメッセージが表示されたビューをロードすると、アプリがクラッシュします。

誰かがここで何が起こっているのか説明できますか?わかりません。

- (IBAction)didTapOkSocialAction:(id)sender;
{
    self.socialActionView = [[[NSBundle mainBundle] loadNibNamed:@"SocialActionViewController" owner:self options:nil] objectAtIndex:0];
    //[self.view addSubview:socialActionView];
}

編集

この場合の解決策は、SocialActionViewController.xibのファイルの所有者をViewController.hに設定することでした。ビューがロードされるビューコントローラ以外の別のビューコントローラクラスに接続されたNIBからUIViewを追加する方法がまだわかりません。

4

2 に答える 2

2

あなたsocialActionViewはすでにそのスーパービューのビュープレースホルダーにバインドされています。

つまり、すでにそこにあります(その参照はすでにサブビューとして追加されています)が、nil実際にロードするまでです。

編集:そこにすべてがどのように接続されているかは明らかではありませんが、以下の追加情報から私は大げさな推測をします。

このコードを試してください:

- (IBAction)didTapOkSocialAction:(id)sender;
{
    UIView *loadedView = [[[NSBundle mainBundle] loadNibNamed:@"SocialActionViewController" owner:self options:nil] objectAtIndex:0];

    [self.view addSubview:loadedView];
}

編集:プログラムで.xibからビューコントローラーをロードしたいので、そのように行うことができます(おそらくビューコントローラーはMyViewController.h、.m、.xibで定義されています):

MyViewController *myViewController;  //as an ivar or a property in @interface


myViewController = [[ViewController alloc] initWithNibName:@"MyViewController" bundle:nil];

次に、そのビューを追加できます。

[self.view addSubview: myViewController.view];
于 2012-05-29T16:00:05.687 に答える
2

このようにプログラムでUIViewを作成した場合

- (IBAction)didTapOkSocialAction:(id)sender;
{
    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 100, 100)];
    myView.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:myView];
    [myView release];
}

その場合、addSubViewは避けられません。そうしないと、myViewが表示されません。私はそれをテストしました。ただし、UIViewがペン先から読み込まれる場合は、動作が異なるようです。すぐに表示されます。

プロパティを削除した2番目のテストでは、ローカル変数のみが残っていました。

于 2012-05-29T17:44:43.707 に答える