我有以下代码,并且已经挣扎了很长一段时间。我有两个视图控制器,FirstView和SecondView。我将ViewController从FirstView推送到SecondView。在SecondView中有一个UITextView,我在其中获取用户的输入。然后我使用SecondView中的委托将该输入保存到FirstView的名为text的变量中。当我运行它时,代码在从SecondView调用委托时进入无限循环。
FirstView.m
UIStoryboard *story=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
SecondView *secondView = [story instantiateViewControllerWithIdentifier:@"SecondView"];
secondView.delegate = self;
[self.navigationController pushViewController:secondView animated:YES];
-(void)setText:(NSString *)strData
{
NSLog(@"Entered setText delegate");
NSLog(@"Current string is %@", strData);
self.text = strData;
}
SecondView.h
@protocol SetInstructionDelegate <NSObject>
-(void)setText:(NSString *)strData;
@end
@property (weak, nonatomic) IBOutlet UITextView *textView;
@property (nonatomic, weak) id<SetInstructionDelegate> delegate;
SecondView.m
-(void)viewDidLoad {
/****************************** Done Button framing ********************************/
UIButton *btn_bar=[[UIButton alloc]initWithFrame:CGRectMake(0, 0, 60, 60)];
[btn_bar setBackgroundColor:[UIColor clearColor]];
[btn_bar setTitle:@"Done" forState:UIControlStateNormal];
[btn_bar addTarget:self action:@selector(doneEditing:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *doneEdit=[[UIBarButtonItem alloc]initWithCustomView:btn_bar];
self.navigationItem.rightBarButtonItem=doneEdit;
}
-(void)doneEditing:(id) sender
{
[self.view.window endEditing: YES];
[self.navigationController popViewControllerAnimated:YES];
NSLog(@"Current text is : %@", self.textView.text);
[[self delegate] setText:self.textView.text];
}
代码保留在doneEditing中,并不断重复打印NSLog。我读了很多这方面的链接,但找不到明确的答案,一直在努力。我是iOS和委托方法的新手。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:0)
问题是您有一个名为text
的属性和一个名为setText:
的方法。给那个方法(或那个属性,我不关心哪个)一个不同的名字。真的应该是方法;给一个方法大肆一个以set...
开头的名字总是可能是一件非常危险的事情。
原因是设置名为text
的属性实际上只是调用名为setText:
的方法的简写。因此,这是一个无限递归:
-(void)setText:(NSString *)strData
{
self.text = strData;
}
你知道,那段代码与完全相同:
-(void)setText:(NSString *)strData
{
[self setText: strData];
}
看到你无限的荣耀递归。