委托方法不被称为目标C.

时间:2016-03-22 12:34:53

标签: ios objective-c delegates

我正在尝试将secondViewController中两个文本字段的数据传递给ViewController,并在ViewController中设置标签文本。

但是没有调用传递数据的委托方法。我通过提交断点来检查它。因此标签文字没有变化。

SecondViewController.h

#import <UIKit/UIKit.h>

@class SecondViewController;
@protocol SecondViewDelegate <NSObject>

-(void)getText1:(NSString*)str1 andText2:(NSString*)str2;

@end
@interface SecondViewController : UIViewController<UITextFieldDelegate>


@property (weak, nonatomic) IBOutlet UITextField *textField1;
@property (weak, nonatomic) IBOutlet UITextField *textField2;
@property (weak) id<SecondViewDelegate>delegate;

@end

SecondViewController.m

#import "SecondViewController.h"

@interface SecondViewController ()




@end

@implementation SecondViewController

@synthesize delegate=_delegate;

- (void)viewDidLoad {
    [super viewDidLoad];
    self.textField1.delegate=self;
    self.textField2.delegate=self;
    [self.textField1 becomeFirstResponder];

    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


-(BOOL)textFieldShouldReturn:(UITextField *)textField
{


    if ( textField == self.textField1 ) { [self.textField1 resignFirstResponder]; [self.textField2 becomeFirstResponder]; }
    else if ( textField == self.textField2)  {


        [_delegate getText1:self.textField1.text andText2:self.textField2.text];

        NSLog(@"%@",self.textField1.text);
        [self.navigationController popToRootViewControllerAnimated:YES];
    }
    return YES;
}
@end

查看Controller.h

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

@interface ViewController : UIViewController<SecondViewDelegate>


-(void)getText1:(NSString *)str1 andText2:(NSString *)str2;
@end

查看Controller.m

#import "ViewController.h"


@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label1;
@property (weak, nonatomic) IBOutlet UILabel *label2;


@end

@implementation ViewController
@synthesize label1;
@synthesize label2;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (IBAction)onClick:(id)sender {
    SecondViewController* sv= [[SecondViewController alloc] init];
    sv.delegate=self;

    [self performSegueWithIdentifier:@"moveToSecondController" sender:self];
}

-(void)getText1:(NSString *)str1 andText2:(NSString *)str2{

    [label1 setText:str1];
    [label2 setText:str2];


}

@end

4 个答案:

答案 0 :(得分:4)

问题在于您创建了两个SecondViewController个对象,并使您的ViewController代表了错误的对象。

这:[[SecondViewController alloc] init]在代码中创建一个对象。这:[self performSegueWithIdentifier:@"moveToSecondController" sender:self]从故事板定义中创建一个对象。

不要打扰创建第一个,只需执行segue。然后,使用目标控制器(这将是正确的prepareForSegue)实现SecondViewController方法并在那里设置您的委托。

答案 1 :(得分:3)

尝试在prepareForSegue方法中设置您的委托,如:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Make sure your segue name in storyboard is the same as this line
    if ([[segue identifier] isEqualToString:@"YOUR_SEGUE_NAME_HERE"])
    {
        // Get reference to the destination view controller
        SecondViewController *vc = [segue destinationViewController];
        vc.delegate=self;

    }
}

答案 2 :(得分:1)

您无需在delegate method中声明ViewController.h。它已在SecondViewController.h中作为委托方法完成。

答案 3 :(得分:1)

import

import&#34; SecondViewController.h&#34;

@interface ViewController:UIViewController

//在ViewController.h文件中删除此方法,这是作为ViewController类的简单方法调用 - (void)getText1:(NSString *)str1和Text2:(NSString *)str2;

@end