0

ビューの画像を 4 ~ 6 個のアイコンのポップアップ ダイアログから変更したい (メッセンジャー アプリケーションで画像を変更するようなものを想像してください)。このモーダル ポップアップを実装する方法は、IB で新しいビューを作成し、背景を不透明にしてから、これをサブビューとしてロードすることです。

    IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
[self.view addSubview:iconsViewController.view];

したがって、ユーザーがアイコンに触れると、

- (IBAction)iconIsSelected:(id)sender {
switch ([sender tag]) {
    case 1:
        [(ParentViewController*)[self superview] changeIcon];
        break;
    case 2:
        // same here..
        break;
    default:
        break;
}
[self.view removeFromSuperview];
[self release];

}

changeIcon は、imageを対応するアイコンに設定するだけです。ご想像のとおり、これは機能していません。changeIcon メッセージは機能しません。私は何が間違っているのか理解できません。

4

2 に答える 2

0

ビューのスーパービューはビュー コントローラーではなくビューですが、スーパービューを class にキャストしますParentViewController。ビューにスーパービューがない場合は が返さnilれ、 nil へのメッセージはノーオペレーションです (これは、そこでクラッシュしない理由を説明しています)。

ところで、[self release]最後は非常に疑わしいです。

于 2010-03-22T19:30:54.917 に答える
0

ここでいくつかの選択肢があります...

最初の 1 つは、タイプの IconsViewController にプロパティを作成することParentViewController*です。次に例を示します。

@property (readwrite,nonatomic,assign) ParentViewController* parentController; // weak reference

これをさらに分解するには:

  • readwrite経由で値にアクセスできるようにしたい[self parentController]だけでなく、経由で変更したいからです[iconsViewController setParentController:self]
  • nonatomic糸くずはあまり気にしないので
  • assign親が子に保持されない「弱参照」にする。それらが相互retainに存在する場合、後でメモリ リークが発生する可能性があります。これは、明示的に解放しない限り、リテイン サークルが発生し、どちらのオブジェクトもリテイン カウントがゼロにならないためです。

nib からロードするときは、次のプロパティを設定します。

IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
iconsViewController.parentController = self;

次に、次のiconIsSelectedように内部から呼び出します。

[[self parentController] changeIcon];

または、デリゲート プロトコルを作成することもできます。

@protocol IconViewSelectedDelegate (NSObject)

- (void) changeIcon;

@end

親View Controllerタイプの代わりに、そのプロトコルをプロパティとして使用します。これはより抽象的ですが、デザインをきれいに保ちます。親View Controllerは、他の多くのプロトコルの1つとして、そのデリゲートプロトコルを実装します。

もう 1 つのオプションは、NSNotificationCenterを使用して、動的ビューからイベントを発行/購読することです。これは 2 つのオブジェクト間の「最も緩い」結合ですが、このシナリオではやり過ぎかもしれません。

于 2010-03-22T19:41:51.690 に答える