0

ポップアップビューコントローラからメインビューコントローラの画像を更新する必要があります。

このボタンは、メインビュー(EraViewController)では「Feature2btn」と呼ばれていますが、ポップアップビューコントローラーで次のコードを試してみると、機能しません。

メインビューはまだバックグラウンドで表示されており、リロードされないため、すぐに更新する必要があります。そのため、変更はポップアップビューのアクションによって直接引き起こされる必要があります。

- (IBAction)purchase:(id)sender {
 HomeController = [[EraViewController alloc] initWithNibName:@"EraViewController" bundle:nil];
    UIImage *image = [UIImage imageNamed:@"ico_plan.png"];
    [(EraViewController*)HomeController setFeature2Btn:[feature2Btn setImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];
 }
4

3 に答える 3

1

これを行うには(少なくとも)2つの方法があります。

  1. 1つのコントローラーがリッスンし、もう1つのコントローラーが適切なタイミングで送信する通知を使用します。
  2. 最初のコントローラが実装し、2番目のコントローラが呼び出し時に実装するデリゲートプロトコルを作成します。

デリゲートはもう少し複雑ですが、一般的には良いスタイルと考えられています。通知も悪くはありませんが、少し「エレガント」ではありません。ここでは、通知ベースの通知について説明します。これは、あなたのケースでは問題ないようであり、通知を登録するだけで複数の場所での購入に対応できるためです。

更新するイメージがあるコントローラーで、次のアドレスに通知を登録しviewDidAppear:ます。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateImage:) name:@"UpdateImageNotification" object:nil];

updateImage:メソッドを実装します。

-(void)updateImage:(NSNotification*)note
{
    NSString* newImageName = note.userInfo[@"imageFileKey"];
    // ... update UI with the new image
}

また、ビューが消えたときにその通知の登録を解除してください。

-(void)viewWillDisappear:(BOOL)animated
{
     [[NSNotificationCenter defaultCenter] removeObserver:self];
     [super viewWillDisappear:animated];
}

更新をトリガーする他のコントローラーで、適切な場所で通知を発行します。

-(IBAction)purchase:(id)sender
{
    // ...

    NSDictionary* userInfo = @{@"imageFileKey" : newImageName};
    [[NSNotificationCenter defaultCenter]
                postNotificationName:@"UpdateImageNotification"
                              object:self userInfo:userInfo];
    // ...
}

object通知コンテキストのパラメーターは、任意のオブジェクトによる通知をリッスンするか、非常に特定のインスタンスのみによる通知をリッスンするかを指定するために使用されます。多くの場合、実際のインスタンスは関係ありませんが、通知を名前で識別します(この場合は「UpdateImageNotification」のように)。

辞書は、userInfo通知とともに提供する必要のある情報を運ぶことを目的としています。そのため、新しい画像名に関連付けられたキー「imageFileKey」を導入しました。

于 2013-03-25T11:53:39.087 に答える
0

ちょっとしたミスをしたと思います。しかし、先に進む前に、以下がシナリオであるかどうかを確認したいと思います。間違っている場合は訂正してください1.画像を更新するmainViewController/HomeViewController(EraViewControllerタイプ)があります2. mainViewControllerには、上記のコードが記述されたポップアップ画面があります。このコードは、mainViewController/HomeViewControllerのボタン画像を変更することを目的としています

上記がシナリオである場合は、次の解決策をお勧めします。

あなたが作ったエラー

上記で投稿したコードでEraViewControllerの新しいオブジェクトを作成し、画像を変更しています。OOPSの概念によれば、そのコントローラーの新しいインスタンスが作成され(画面に表示されない2番目のインスタンス)、そのインスタンスに新しいイメージを適用します。そのインスタンスはまったく表示されないため、画面が更新されていないように感じられます。

解決

この問題には少なくとも3つの解決策があります。1。1つの解決策は、Daniel Schnellerが回答します(おそらく少し変更を加えます)。2。代表者を通じてこれを達成するため。-PopViewControllerでプロトコルを記述し、HomeViewController/mainViewControllerに実装する必要があります。-画像が変更されると、PopViewControllerで、デリゲートとプロトコルメソッドを使用してmainViewControllerに通知する必要があります。-mainViewControllerが通知を受け取り、プロトコルメソッドが実行されるようにします。その方法では、ボタンの画像を更新するコードが必要です。3.(これは適切な設計ではないため、これは推奨されません)画面に表示される実際のviewControllerのインスタンスを維持しています(変数では、homeViewControllerなど)。

- (IBAction)purchase:(id)sender {
    UIImage *image = [UIImage imageNamed:@"ico_plan.png"];
    [(EraViewController*)homeViewController setFeature2Btn:[feature2Btn setImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];
 }

これが役に立ちます。

ありがとう

于 2013-03-25T12:06:01.930 に答える
-1

これを試して、

 - (IBAction)purchase:(id)sender 
 {
       [[NSNotificationCenter defaultCenter] postNotificationName:@"updateimage"        object:imageName];
  }

mainviewcontrollerで

-(void)viewDidLoad

{
 [[NSNotificationCenter defaultCenter] removeObserver:self];
 [[NSNotificationCenter defaultCenter] addObserver:self    selector:@selector(updateiimage:) name:@"updateimage" object:nil];

 }

- (void) updateiimage:(NSNotification *)notification
{
  NSString * text =[notification object];
   //update Image
 }
于 2013-03-25T11:40:08.877 に答える