当用户在字段中键入至少一个字符时,uitextfield rightView可见

时间:2013-12-14 15:55:23

标签: ios objective-c ios7

我想知道是否有任何方法可以让UITextField的正确视图仅在内部至少有一个角色时才可见,因为设置UITextFieldViewModeWhileEditing会在我关注时显示在球场上,而不是我开始打字时。

我只能实现UITextFieldDelegate并在用户输入时触发的其中一种方法上执行此操作。这里唯一的问题是,在创建文本字段并将其添加到视图后,我将文本字段的委托更改为其他内容。那是因为我通过继承UITextField创建了一个自定义文本字段,并在不同的地方初始化它,在那些不同的地方,我将它的委托分配给它发起的当前位置。

2 个答案:

答案 0 :(得分:2)

这是一个更好的主意。 UITextField发布更改通知。你的子类可以这样观察:

// in RSSUITextField.m

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(textFieldChanged:)
                                             name:UITextFieldTextDidChangeNotification
                                           object:self];

然后实现textFieldChanged:并在那里更改rightView状态。这个答案优于我留下的其他答案,但我不会删除那个,因为它也有效,并且对于控件不发布关于我们关心的状态变化的通知的情况是一种有用的技术。

由于RSSUITextField的每个实例都将使用NSNotificationCenter观察自己,因此当它们不再重要时,每个实例都有责任将自己作为观察者移除。最新的可能时间是dealloc ......

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

答案 1 :(得分:0)

这个答案有效,但对于您的具体案例有更好的答案。请参阅我的其他答案...文本字段在文本更改时发布NSNotification ....

KVO将是理想的,但UIKit不承诺KVO合规。更抽象的问题陈述是,您希望一个对象知道文本字段的状态,只能由委托知道,但有时您希望其他对象成为委托。

我唯一没有违反任何规则的想法是让子类成为真正委托的代理,就像这样......

// in RSSUITextField.m
@interface RSSUITextField () <UITextFieldDelegate>
// I will be my own delegate, but I need to respect the real one
@property (weak, nonatomic) id<UITextFieldDelegate>proxyDelegate;

@end

在指定的初始化中......

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.delegate = self;
    }
    return self;
}

我是我自己的委托,所以当这个类的调用者想要获取/设置委托时,我需要欺骗他......

- (id<UITextFieldDelegate>)delegate {
    return self.proxyDelegate;
}

- (void)setDelegate:(id<UITextFieldDelegate>)delegate {
    self.proxyDelegate = delegate;
}

现在是重要部分(然后是悲伤部分)。重要的一部分:我们现在能够了解我们作为代表的州,并且仍然尊重来电者对代表的看法......

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    // show or change my right view

    if ([self.proxyDelegate respondsToSelector:@selector(textFieldDidBeginEditing:)]) {
        [self.proxyDelegate textFieldDidBeginEditing:textField];
    }
}

- (void)textFieldDidEndEditing:(UITextField *)textField {

    // hide or change my right view

    if ([self.proxyDelegate respondsToSelector:@selector(textFieldDidBeginEditing:)]) {
        [self.proxyDelegate textFieldDidBeginEditing:textField];
    }
}
悲伤的部分:我们打破了它,所以我们买了它。为了完全尊重代表,我们必须传递所有代理消息。这不是灾难,因为它们只有五个。他们都将采取这种形式:

// I only added this one as an example, but do this with all five others
- (BOOL)textFieldShouldReturn:(UITextField *)textField {

    if ([self.proxyDelegate respondsToSelector:@selector(textFieldShouldReturn:)]) {
        return [self.proxyDelegate textFieldShouldReturn:textField];
    } else {
        return YES;  // the default from the docs
    }
}