0

ポップオーバーを閉じ、ポップオーバーでボタンがクリックされたときに変数を返そうとしています。4つのボタンがあり、ボタンを選択すると、変数(ボタンに基づく)が元のView Controllerに戻され、ポップオーバーが閉じます。変数の受け渡しを試みる方法がわかりませんが、少なくともこのページ(http://stackoverflow.com/questions/3565968/dismiss-popover-using-uibutton)を使用してボタンクリックでポップオーバーを閉じようとしています。 )、これは何らかの理由で私には機能しません。ボタンをクリックしても何も起こりません。

AddWineViewControllerは、「ルート」ビューコントローラーです。

//AddWineViewController.h
//this is the "root" view controller
#import "WineStyleViewController.h"
@interface AddWineViewController : UIViewController <UIPopoverControllerDelegate, MyPopoverDelegate>
@property (nonatomic, retain) UIPopoverController *myPopoverController;

 

//AddWineViewController.m
@implementation AddWineViewController
@synthesize myPopoverController;
-(void)didClickCancelButton {
    //I would like to have the variable passed here, something like self.wineStyle.text=wineStyle; where wineStyle is the variable from the popover.
    [myPopoverController dismissPopoverAnimated:YES];
}

WineStyleViewControllerはポップオーバービューコントローラーです

//WineStyleViewController.h
@protocol MyPopoverDelegate <NSObject>
    -(void)didClickCancelButton;
@end
@interface WineStyleViewController : UIViewController
@property (nonatomic, assign) id<MyPopoverDelegate> delegate; 
@property (nonatomic, strong) NSString *wineStyle;
- (IBAction)redWineButton:(id)sender;

 

//WineStyleViewController.m
@implementation WineStyleViewController
@synthesize wineStyle;
@synthesize delegate;

- (IBAction)redWineButton:(id)sender {
    wineStyle=@"Red";
    [self.delegate didClickCancelButton];
}
4

5 に答える 5

1

IBAction接続が正しく行われていることを前提としています(ボタンを押すとメソッドが実際に実行されます)。それで、私の次の考えはself.delegate、コントローラーが画面に表示されているときに(AddWineViewControllerポップオーバーが表示されるの方法で)正しく設定されていないということです。

さらに、いくつかのことを念頭に置いて、プロトコルのインターフェイスを少し変更する可能性があることにも言及する必要があります。

  1. ポップオーバーの却下をトリガーするためにキャンセルが押されたことを代表者に伝えません。代わりに、選択が行われたことを伝えます。
  2. 私は署名で「子」を渡すプロトコルメソッドを好みます。[self.delegate didChooseWineStyle: self]
于 2012-07-17T13:58:30.970 に答える
1

「wineStyle」を「MyPopover」プロトコルに渡すには、プロトコルに変数を追加するだけです。

@protocol MyPopoverDelegate <NSObject>
    -(void)didClickCancelButton:(WineStyle)wineStyle;
@end

..そして、次のように、デリゲートに送信されていることを確認します。

if ([delegate conformsToProtocol:@protocol(MyPopoverDelegate)]) {
   if ([delegate respondsToSelector:@selector(didClickCancelButton:)]) {
       [delegate didClickCancelButton:selectedWineStyle];
   }
}

ポップオーバーが却下されないことに関しては、必ずUIPopoverControllerへの参照を保存し、次のように呼び出してください。

- (void)didClickCancelButton:(WineStyle)wineStyle {
   // ... do something with "wineStyle" here
   [currentPopover dismissPopoverAnimated:YES];
}
于 2012-07-17T14:04:13.157 に答える
1

最初にいくつかの仮定をします。ストーリーボード内のすべての接続が接続され、すべてのオブジェクトが適切に作成され、セグエでデリゲートを自分自身に設定しているということです。

念のために...セグエに次のものが含まれていることを確認してください。

// set your destination view controller
WineStyleViewController *destinationController = segue.destinationViewController;
destinationController.delegate=self;

デリゲート(ポップオーバー):WineStyleViewControllerで、プロトコルを次のように定義します。

@protocol MyPopoverDelegate <NSObject>
    -(void)didClickCancelButton;
@end

ただし、wineStyleをルートコントローラー(AddWineViewController)に戻したいので、1)変数(wineStyle)を追加して戻し、2)デリゲートのViewControllerを渡します(キャンセルではなく保存に変更する自由を取りました) )。

@protocol MyPopoverDelegate <NSObject>
-(void)didClickSaveButton (WineStyleViewController *)wineStyleViewController withWineStyle (NSString *)wineStyle;
@end

ここで、AddWineViewControllerに戻ります。

あなた-(void)didClickCancelButton:(WineStyle)wineStyleはあなたがあなたの代表者からあなたのワインスタイルを受け取る場所です、それでこの方法はより多くのように見えるべきです:(再びそれを保存して変更する)

-(void)didSave
{
    // your methods for dealing with your added wineStyle go hear, as
    // you will already have wineStyle sent back to you from your delegate
    [myPopoverController dismissPopoverAnimated:YES];
} 

それが役立つことを願っています:D

于 2012-08-05T11:08:29.377 に答える
0

あなたはポップオーバーコントローラーにどのポップオーバーを所有するかを伝える必要があります、あなたはそれをしていません。自分の意見をどのように表現しているかはわかりませんが、次のようなものが必要です。

   UIPopoverController paparazzi = [[UIPopoverController alloc] initWithContentViewController:temp];
于 2012-07-17T13:56:22.957 に答える
0

このチュートリアルは、同様の問題で私を本当に助けてくれました:http: //ios.biomsoft.com/2011/10/17/beginning-storyboards-in-ios-5-part-2/

于 2012-07-20T15:25:16.120 に答える