不会从第二个视图调用第一个视图中的Delegate方法

时间:2012-07-01 19:00:07

标签: ios delegates uinavigationcontroller

在视图中,我们先调用它,然后按如下方式创建第二个视图,如果在第一个视图中发生了某些事情,则将其推送:

SecondViewController *secondVC = [[secondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];


    [self.navigationController pushViewController:secondVC animated:YES];
    [secondVC release];

现在,当我在第二个视图中,如果按下按钮,我想回到firstView,并将值从secondView传回第一个视图(假设从第二个视图到第一个视图的文本字段的整数值) )。

以下是我的尝试:

@protocol SecondViewControllerDelegate;

#import <UIKit/UIKit.h>
#import "firstViewController.h"

@interface SecondViewController : UIViewController <UITextFieldDelegate>
{
    UITextField *xInput;
    id <SecondViewControllerDelegate> delegate;
}

- (IBAction)useXPressed:(UIButton *)sender;

@property (assign) id <SecondViewControllerDelegate> delegate;

@property (retain) IBOutlet UITextField *xInput;

@end

@protocol SecondViewControllerDelegate
- (void)secondViewController:(SecondViewController *)sender xValue:(int)value;

@end

并在m文件中

- (IBAction)useXPressed:(UIButton *)sender
{
    [self.delegate secondViewController:self xValue:1234]; // 1234 is just for test
}

然后在第一个视图中我做了:

#import "SecondViewController.h"

@interface FirstViewController : UITableViewController <SecondViewControllerDelegate> {

}

@end

并实施:

- (void) secondViewController:(SecondViewController *)sender xValue:(int)value
{
    [self.navigationController popViewControllerAnimated:YES];
}

现在,问题出现在FirstViewController中,我得到的警告是“找不到协议的定义”SecondViewControllerDelegate“,而且两个委托方法(上面的最后一段代码)根本没有被调用。有人可以请告诉我出了什么问题?

3 个答案:

答案 0 :(得分:1)

此行之后

SecondViewController *secondVC = [[secondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];

添加

secondVC.delegate = self;

也代替

- (void) secondViewController:(SecondViewController *)sender xValue:(int)value
{
    [self.navigationController popViewControllerAnimated:YES];
}

你应该使用

- (void) secondViewController:(SecondViewController *)sender xValue:(int)value
{
    [sender popViewControllerAnimated:YES];
}

答案 1 :(得分:1)

FirstViewController .h文件中:

#import "SecondViewController.h"

@interface FirstViewController : UITableViewController <SecondViewControllerDelegate> {

SecondViewController *secondViewController;

}

@end

在实现文件中,您在其中初始化SecondViewController实例的下一行,将self分配给委托属性:

secondViewController.delegate = self;

接下来定义委托方法:

- (void)secondViewController:(SecondViewController *)sender xValue:(int)value
{
NSLog ("This is a Second View Controller with value %i",value)
}

答案 2 :(得分:0)

对于问题1:@protocol的{​​{1}}定义看起来像SecondViewControllerDelegate;你确定这个文件是在secondViewController.h中导入的吗?否则它不会知道协议。

问题2:它可能与问题1完全无关。您确定该动作是否正确连接?您可以在firstViewController.h中进行NSLog()调用,以确保该方法实际上是在您预期的时候调用的吗?