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

Ios 当用户在字段中键入至少一个字符时,uitextfield rightView可见,ios,objective-c,ios7,Ios,Objective C,Ios7,我想知道是否有任何方法可以使UITextField的右视图仅在至少有一个字符时可见,因为通过设置UITextFieldViewModeWhileEditing将在我聚焦字段时显示,而不是在我开始键入时 我只能实现UITextFieldDelegate,并在用户键入时触发的方法之一上实现它。这里唯一的问题是,创建文本字段并将其添加到视图后,我将文本字段的委托更改为其他内容。这是因为我通过子类化UITextField创建了一个自定义textfield,并在不同的位置初始化它,在这些不同的位置我将它的

我想知道是否有任何方法可以使
UITextField
的右视图仅在至少有一个字符时可见,因为通过设置
UITextFieldViewModeWhileEditing
将在我聚焦字段时显示,而不是在我开始键入时


我只能实现
UITextFieldDelegate
,并在用户键入时触发的方法之一上实现它。这里唯一的问题是,创建文本字段并将其添加到视图后,我将文本字段的委托更改为其他内容。这是因为我通过子类化
UITextField
创建了一个自定义textfield,并在不同的位置初始化它,在这些不同的位置我将它的委托分配给它启动的当前位置。

这个答案有效,但对于您的特定情况有一个更好的答案。看看我的另一个答案。。。文本字段在文本更改时发布通知

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<UITextFieldDelegate>)delegate {
    return self.proxyDelegate;
}

- (void)setDelegate:(id<UITextFieldDelegate>)delegate {
    self.proxyDelegate = delegate;
}
可悲的是:我们把它弄坏了,所以我们买了它。为了充分尊重委托,我们必须传递所有委托消息。这不是一场灾难,因为只有五个。它们将完全采用这种形式:

// 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
    }
}

这里有个更好的主意。UITextField发布更改通知。您的子类可以这样观察自己:

// in RSSUITextField.m

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(textFieldChanged:)
                                             name:UITextFieldTextDidChangeNotification
                                           object:self];
然后实现
textFieldChanged:
并在其中更改rightView状态。这个答案优于我留下的另一个答案,但我不会删除这个答案,因为它也可以工作,对于控件不发布我们关心的状态更改通知的情况,这是一种有用的技术

由于RSSUITextField的每个实例都将通过NSNotificationCenter进行自我观察,因此当不再重要时,每个实例都有责任将自己作为观察者移除。最晚可能的时间是在DealLocal

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

既然您已经有了一个自定义子类,那么给它一个属性作为委托数组怎么样?子类是它自己的委托,它对arrayI中的所有内容调用委托选择器,请参见。。。我不知道你要往哪个方向走,但我如何在同一时间使用两个代理?或者我应该在子类中使用KVO来显示和隐藏rightView和委托,因为我已经在使用它了?不确定这是否适合您,但是您的委托方法的子类实现将调用数组中的每个成员,其中包含(id myDelegate in self.delegates){/*的委托消息,如果它实现了选择器,那么*/[myDelegate performSelector:@selector(textFieldDidBeginEditing:);等等。我真的需要一个这样的例子,如果我有了这个想法,似乎有点不方便。现在,我有一个名为
RSSUITextField:UITextField
的子类,它除了自定义文本字段的外观外,什么都不做。在不同的地方(
UIViewControllers
)我初始化自定义文本字段并将委托分配给self
someCustomTextField.delegate=self
,其中在本文中,
self
UIViewController
。现在,除了需要遵守
UITextFieldDelegate
协议之外,如何在自定义子类本身中使用第二个委托ol?我会稍微调整一下我的想法并把它写下来作为一个答案。这也是我的想法,但我有点不确定当我离开视图控制器导航时,是否会启动十几个输入字段,是否会删除观察者?因为在某个点上,如果不这样做,我会得到很多。有没有一种方法可以在操作完成后删除观察者视图控制器是否从子类本身解除分配?
// in RSSUITextField.m

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(textFieldChanged:)
                                             name:UITextFieldTextDidChangeNotification
                                           object:self];
- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}