我正在尝试将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
答案 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)
@interface ViewController:UIViewController
//在ViewController.h文件中删除此方法,这是作为ViewController类的简单方法调用 - (void)getText1:(NSString *)str1和Text2:(NSString *)str2;
@end