2010-12-15 33 views
0

在视图控制器上,我有多个文本框,它们都使用相同的代理。现在在委托中,代码变得非常难看,因为我必须区分所有的文本字段(一堆if/else-if或switch语句)。我来到一个交叉的这篇文章:在iPhone中使用块设置代理

Blocks in textfield delegates

但是从这个我还是不明白这是如何解决这个问题?这不是基本上调用一个方法,并传递它的文本和方法不知道什么文本字段给了字符串?你仍然需要区分文本字段,但是这次在块内部(使用通常的if(textfield == bazTextField)...)。

+0

我不太了解这个东西,但在阅读该博客文章后我会问同样的问题。我建议直接联系博主。 – chris 2010-12-15 19:36:35

回答

1

我不知道它完全解决了这个问题,因为它转移了它(并且进入了viewDidLoad,它通常在它里面有点糊涂)。

然而在这个例子中,块本身被传递到文本字段中以便与所有实例变量的值进行比较并“记住”它们的值(如果引用它们),这就是它如何知道文本和文本字段正在处理中。

虽然我不明白代码究竟应该如何帮助,因为它将一个代码块分配给与所有文本字段代表一起使用的单个代理类 - 除非也许您应该为每个文本字段指定一个代码段,每个都有不同的块。那么,你有更多的代码比你的if语句更多!

+0

最后我得出了同样的结论。它只是把混乱转移到一个可能也很麻烦的地方。 – Guu 2011-03-17 10:02:41

0

该文章没有说清楚,但我相信这个想法是为您希望对textFieldShouldReturn做出响应的每个UITextField创建其中一个块(并阻止委托对象)。

0

嗯,也许我并没有完全理解这篇文章,但在具体的例子中,我没有看到使用块代替选择器的好处。 你可以实现类似这样

@interface AlternativeTextFieldDelegate : NSObject <UITextFieldDelegate> 
{ 
    SEL selectorToCall; 
    id objectToCall; 
} 
- (void) setObjectToCall:(id)obj selector:(SEL)selector; 
@end 

@implementation AlternativeTextFieldDelegate 

- (void) setObjectToCall:(id)obj selector:(SEL)selector 
{ 
    objectToCall = obj; 
    selectorToCall = selector; 
} 
- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [objectToCall performSelector:selectorToCall]; 
    return YES; 
} 

@end 

和一些视图控制器

@interface ViewWithTextFieldsController : UIViewController 
{ 
    UITextField *tf1; 
    AlternativeTextFieldDelegate *delegateForTF1; 
    UITextField *tf2; 
    AlternativeTextFieldDelegate *delegateForTF2; 
} 
// ...IBOutlets and all that... 

- (void) tf1ShouldReturn; // handles shouldReturn for tf1 
- (void) tf2ShouldReturn; // handles shouldReturn for tf2 

@end 

@implementation ViewWithTextFieldsController 

- (void) viewDidLoad // or wherever 
{ 
    delegateForTF1 = [[AlternativeTextFieldDelegate alloc] init]; 
    [delegateForTF1 setObjectToCall:self selector:@selector(tf1ShouldReturn)]; 
    tf1.delegate = delegateForTF1; 

    delegateForTF2 = [[AlternativeTextFieldDelegate alloc] init]; 
    [delegateForTF2 setObjectToCall:self selector:@selector(tf2ShouldReturn)]; 
    tf2.delegate = delegateForTF2; 
} 
// ... 

@end 

真的不知道这是比任何虽然链接if-else好多了。
在我看来,这使问题更复杂,而不是解决问题。

+0

对于带有几个UITextFields的简单情况,我会同意它使事情变得复杂。我认为解决方案的目标是涉及大量领域的情况(可能超过10个)。我对这篇文章的第一反应是,它也可以通过选择器来完成。因此,无论您使用选择器还是块,都可能是您想要放置代码的个人偏好。 – drekka 2010-12-16 00:37:01