2

現在のView Controllerを閉じた後、以前のView Controllerにデータを渡すデリゲートを作成しました。

これは私がデリゲートを設定する方法です

PaymentViewController.m

-(IBAction)techProcessAction:(id)sender
{
TechProcessPaymentVC *techVC = [[TechProcessPaymentVC alloc]init];
[techVC setTechDelegate:self];
 NSLog(@"DELEGATE == %@",techVC.techDelegate);

[self performSegueWithIdentifier:@"techProcess" sender:nil];
}

デリゲートが設定されていることがわかります

Snap2Door[1765:1c703] DELEGATE == <PaymentDetailViewController: 0x9d3a360>

しかし、私がそれをチェックインするとTechProcessPaymentVCviewDidLoadDELEGATE == (null)

これが、 にあるコールバック メソッドが呼び出されない理由だと思いますPaymentViewController.m

これは私がデリゲートを定義した方法ですTechProcessPaymentVC.h

@protocol techProcessDelegate <NSObject>
-(void) techProcessViewControllerDismissed:(NSString *)paymentStatus;
@end

@interface TechProcessPaymentVC : UIViewController<UIWebViewDelegate>
{
id techDelegate;
}
@property (nonatomic, assign) id<techProcessDelegate>    techDelegate;

これが、存在するメソッドを呼び出そうとする方法ですPaymentViewController.m

if ([[substrings objectAtIndex:0] isEqualToString:@"failure"]) {
        [self.techDelegate techProcessViewControllerDismissed:@"failure"];
        [self dismissViewControllerAnimated:YES completion:nil];
    }
4

4 に答える 4

2

あなたの問題は、あなたが何もしないtechVCということです。それを割り当て、そのデリゲートを割り当ててから、スコープ外に出します (ARC で割り当てが解除されるか、そうでなければリークされます)。

次のことを試してください: まず、インスタンス化と割り当てを から削除しますtechProcessAction:。次に、実装してから、セグエのになるようにprepareForSegue:sender:割り当てます。メソッドは次の「コード」のようになります (これはメモリから入力したもので、コンパイルは試みていません)。selftechDelegatedestinationViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"techProcess"]) {
        ((TechProcessPaymentVC *)segue.destinationViewController).techDelegate = self;
    }
}

-(IBAction)techProcessAction:(id)sender
{
    [self performSegueWithIdentifier:@"techProcess" sender:nil];
}
于 2013-08-28T08:39:43.437 に答える
0

宛先ビュー コントローラーがナビゲーション コントローラーにラップされている場合は、prepareForSegue で別の方法で参照する必要があります。

UINavigationController *nav = segue.destinationViewController;
DetailViewController *dvc = [nav.viewControllers objectAtIndex:0];
于 2013-08-28T08:41:56.330 に答える
0

viewDidLoadインスタンスを呼び出すときに呼び出されinitますTechProcessPaymentVC。その後、デリゲートが設定されます。したがって、それはnilです。initメソッドを に変更しinitWithDelegate、 を割り当ててdelegateで使用しviewDidLoadます。

編集

コード:

TechProcessPaymentVC.h

@interface TechProcessPaymentVC : UIViewController

- (id) initWithDelegate:(id<techProcessDelegate>)delegate;

@end

TechProcessPaymentVC.m

#import "TechProcessPaymentVC.h"

@implementation TechProcessPaymentVC

- (id) initWithDelegate:(id<techProcessDelegate>)delegate {
    self = [super init];
    if(self) {
        self.techDelegate = delegate;
    }
    return self;
}

@end

通話を変更する

-(IBAction)techProcessAction:(id)sender
{
    TechProcessPaymentVC *techVC = [[TechProcessPaymentVC alloc]initWithDelegate:self];
    //....
}

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

于 2013-08-28T07:53:35.263 に答える
-3

TechProcessPaymentVC.h 内:

@interface TechProcessPaymentVC : UIViewController<UIWebViewDelegate>
{
    id techDelegate_;
}
@property (nonatomic, assign) id<techProcessDelegate> techDelegate;
@end

TechProcessPaymentVC.m 内:

@implementation TechProcessPaymentVC
@synthesize techDelegate = techDelegate_;

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"%@", techDelegate_);
}
.
.
.
@end

それがあなたのために働くことを願っています!!!

于 2013-08-28T08:27:22.277 に答える