2

在关闭当前视图控制器后,我创建了一个委托将数据传回前一个视图控制器。

这就是我设置代表的方式

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>

但是当我检查它时,TechProcessPaymentVCviewDidLoad得到了DELEGATE == (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:然后分配selftechDelegatesegue 的destinationViewController。您的方法将类似于以下“代码”(我从内存中键入但没有尝试编译):

- (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

viewDidLoad当你实例时init被调用。TechProcessPaymentVC之后设置代表。因此它是nilinit将您的方法修改为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 回答
0

如果您的目标视图控制器被包装到导航控制器中,您必须在 prepareForSegue 中以不同的方式引用它:

UINavigationController *nav = segue.destinationViewController;
DetailViewController *dvc = [nav.viewControllers objectAtIndex:0];
于 2013-08-28T08:41:56.330 回答
-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 回答