使用View控制器委派进入无限循环

时间:2014-12-13 01:04:28

标签: ios delegates

我有以下代码,并且已经挣扎了很长一段时间。我有两个视图控制器,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和委托方法的新手。任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

问题是您有一个名为text的属性和一个名为setText:的方法。给那个方法(或那个属性,我不关心哪个)一个不同的名字。真的应该是方法;给一个方法大肆一个以set...开头的名字总是可能是一件非常危险的事情。

原因是设置名为text的属性实际上只是调用名为setText:的方法的简写。因此,这是一个无限递归:

-(void)setText:(NSString *)strData
{
self.text = strData;
}

你知道,那段代码完全相同:

-(void)setText:(NSString *)strData
{
[self setText: strData];
}

看到你无限的荣耀递归。