1

iPadアプリをやっています。これで2つのviewcontrollersができました.viewcontrollerには、2番目のviewcontroller(PopoverController)へのポップオーバーセグエを持つbutton1があります。次に、PopoverController には button2 があり、button2 をクリックすると、サーバーから UIImage を受け取ります。ボタン2をクリックすると、UIImageViewのいくつかのサブビューをViewControllerに追加して、これらの画像を表示したいと考えています。

button1 はうまく機能し、PopoverController は期待どおりにポップアップできます。しかし、ボタン2をクリックしても何も起こりませんでした。2 つのビューコントローラー間でデータを渡す方法と、別のビューコントローラーにサブビューを追加する方法を知りたいです。

私の問題に関連するいくつかのコード:

ViewController.h:

#import <UIKit/UIKit.h>

@class PopoverController;

@interface ViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIButton *button1;
@property (strong, nonatomic) PopoverController *popoverController;

@end

PopoverController.h:

#import <UIKit/UIKit.h>

@class ViewController;

@interface PopoverController : UIViewController
@property (strong, nonatomic) IBOutlet UIButton *button2;
@property (strong, nonatomic) UIImage *tempImg;
@property (strong, nonatomic) ViewController *viewController;

- (IBAction)addsubviews:(id)sender;

@end

[viewController.view addSubview:img1];サブビューを追加する- (IBAction)addsubviews:(id)sender;メソッドで使用することはできません。誰かが私を助けることができますか?:)

====1回目の更新====

メソッドを使用する必要があると誰かが提案しています- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender。ボタン2をコントロールクリックし、ボタン2とViewControllerの間にカスタムセグエを作成して、これを試しました。button2 をクリックすると、次のように表示されました。 Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue 'change'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.'

だから私は追加するかどうか疑問に思っていNavigationControllerます。もしそうなら、私は何をすべきですか?

====2回目の更新====

私は現在 Paramasivan のコードを使用しており、別のビューコントローラーからメソッドを呼び出す方法を見つけました。問題は、viewcontroller に新しく追加されたサブビューが表示されないことです。ビューコントローラーを表示するには、ビューコントローラーを更新する必要があると思います。

- (IBAction)addsubviews:(id)sender;のメソッドでは、ViewController でメソッドを呼び出します。[self.viewController createSubViewWithImage:_tempImg];

ボタン2をクリックするとメソッドを呼び出すことができますが、viewcontrollerのビューは何も変更されていません。

4

4 に答える 4

1

ViewController.h に以下を追加します

-(void)createSubViewWithImage:(UIImage *)imageDownloaded {
    UIImageView *imageViewTemp = [[UIImageView alloc] initWithImage:imageDownloaded];
    [self.view addSubView:imageViewTemp];
}

PopoverController.h に以下を追加します

@property (nonatomic, retain) ViewController *viewControllerPassed;

画像をダウンロードしたら、PopoverController.h で次のように呼び出します。

[viewControllerPassed createSubViewWithImage:imageDownloaded];
于 2012-11-28T07:39:27.823 に答える
1

Communicating with Objectsのドキュメントを確認してください。必要なことを行うにはいくつかの方法があります。

于 2012-11-28T07:36:31.890 に答える
1

これを に追加して- (void)viewDidLoad

self.popoverController = [[PopoverController alloc] init]; 
self.popoverController.viewController = self;

他の場所で を設定していないことを確認してくださいself.popoverController = ...

クラスのようなものを追加しないでください。そして、あなたもそうする必要はありません。すでにある場合は、これらの行を削除してください。self.viewController = ...popovercontrollerself.viewController.popoverController = self;

これらが完了したら、ポップオーバーにのみ表示され、そこでクラスself.popoverControllerの新しいオブジェクトを作成していないことを確認してください。したがって、これらが問題ない場合は、クラスからクラスにpopoverController画像を渡すために必要なアプローチを使用できます。popoverControllerviewController

コメントで述べたよう[self.viewController createSubViewWithImage:_tempImg];に、popovercontrollerクラスで使用できます。

更新:prepareForSegueストーリーボードを使用している場合は、これをメソッドで 設定する必要があり、作成する必要self.popoverControllerはまったくありません。ケースのその部分を削除します。ここに記載されている手順に従って、カスタム セグエを設定しprepareForSegue、オブジェクトを渡すメソッドを実装できます。出典:ストーリーボード、ビュー、データの受け渡しについて

  1. ストーリーボードのセグエの名前を「CustomSegue」に設定します
  2. 実施prepareForSegue方法
  3. メソッド内で、セグエの名前が「CustomSegue」と一致するかどうかを確認viewControllerし、popoverControllerオブジェクトに次のように設定します。

試す、

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"CustomSegue"]) {
        PopoverController *popoverController = [segue destinationViewController];
        popoverController.viewController = self;
    }
}

[self.viewController createSubViewWithImage:_tempImg];これを行った後、popoverControllerクラスを呼び出す必要があります。

于 2012-11-30T00:44:35.507 に答える
0

以下のメソッドを使用してデータを渡すことができます。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
 {
    if ([segue.identifier isEqualToString:@"ViewController2"])
    {
        ViewController2 *v2VC = [segue destinationViewController];
        v2VC.yourData = self.someStuff;
    }
 }
于 2012-11-28T07:34:26.767 に答える