在iPhone中使用块设置委托

时间:2010-12-15 19:18:41

标签: iphone objective-c objective-c-blocks

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

Blocks in textfield delegates

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

3 个答案:

答案 0 :(得分:1)

我不知道它确切地解决了这个问题,就像转移它一样(并且进入viewDidLoad,无论如何它通常都会有点糊涂)。

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

我不知道该代码究竟应该如何帮助,因为它将一个块分配给单个委托类以与所有文本字段委托一起使用 - 除非你应该每个文本字段有一个,每个用不同的块。那么你有比使用if语句更多的代码!

答案 1 :(得分:0)

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

答案 2 :(得分: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更好 在我看来,这比解决的问题更复杂。