在视图控制器上,我有多个文本字段,它们都使用相同的委托。现在在委托中,代码变得非常难看,因为我必须区分所有文本字段(一堆 if/else-if 或 switch 语句)。我来了这篇文章:
但是从这里我仍然不明白这是如何解决问题的?这基本上不是调用一个方法并将文本传递给它,而该方法不知道文本字段给出了字符串吗?您仍然需要区分文本字段,但这次在块内(使用通常的 if(textfield == bazTextField)...)。
在视图控制器上,我有多个文本字段,它们都使用相同的委托。现在在委托中,代码变得非常难看,因为我必须区分所有文本字段(一堆 if/else-if 或 switch 语句)。我来了这篇文章:
但是从这里我仍然不明白这是如何解决问题的?这基本上不是调用一个方法并将文本传递给它,而该方法不知道文本字段给出了字符串吗?您仍然需要区分文本字段,但这次在块内(使用通常的 if(textfield == bazTextField)...)。
我不知道它是否完全解决了问题,而是将其转移(并进入 viewDidLoad,无论如何它通常都会得到一些糊状)。
然而,在该示例中,块本身在文本字段中被传递以运行比较并“记住”所有实例变量的值(如果它引用它们),所以它知道文本和文本字段是什么处理。
不过,我看不出该代码到底应该如何提供帮助,因为它将一个块分配给单个委托类以与所有文本字段委托一起使用-除非您应该每个文本字段都有一个,每个文本字段都有一个不同的堵塞。那么你的代码比使用 if 语句的代码要多得多!
这篇文章没有说清楚,但我相信这个想法是为您希望响应 textFieldShouldReturn 的每个 UITextField 创建这些块之一(和块委托对象)。
嗯,也许我没有完全理解这篇文章,但是在那个具体的例子中我没有看到使用块而不是选择器的好处。你可以实现类似的东西
@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
s 更好。
在我看来,这比它解决的问题更复杂。