Ios 当UITextField是第一个响应者而不使用代理时,是否有方法捕获返回键按下?

Ios 当UITextField是第一个响应者而不使用代理时,是否有方法捕获返回键按下?,ios,uitextfield,subclass,Ios,Uitextfield,Subclass,我想创建一个UITextField子类,该子类在按下返回键时具有预定义的操作,但在所有其他方面与UITextField没有区别。编辑:我希望委托像往常一样工作——一种方法是创建一个委托,向子类发送textFieldshouldReturn:,并向实际委托发送其他消息,但如果可能的话,我更希望将其保留在一个对象中。您可以在子类中重写textFieldshouldReturn方法。该类将完成普通UItextField所做的所有事情 更新 @interface MyTextField : UIText

我想创建一个UITextField子类,该子类在按下返回键时具有预定义的操作,但在所有其他方面与UITextField没有区别。编辑:我希望委托像往常一样工作——一种方法是创建一个委托,向子类发送
textFieldshouldReturn:
,并向实际委托发送其他消息,但如果可能的话,我更希望将其保留在一个对象中。

您可以在子类中重写textFieldshouldReturn方法。该类将完成普通UItextField所做的所有事情

更新

@interface MyTextField : UITextField {

}

@end



@implementation MyTextField


- (CGRect)textRectForBounds:(CGRect)bounds {

    return CGRectInset(bounds, 10, 0);
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds, 10, 0);
}

- (void) drawRect:(CGRect)rect{
    [super drawRect:rect];
}



-(BOOL)textFieldShouldReturn:(UITextField*)textField {

 //write you code here to capture the return key.
 //Make sure to change textfield's class from interface builder if you are using interfce builder or initialize by code.
 }
@end

解决方案是让UITextField子类有一个自定义的私有委托,您可以在textfield和它的“普通”委托之间插入该委托

您可以在initWithFrame:和initWithCoder:方法中创建私有委托,并将其用作委托。由于UITextField的delegate属性不保留其内容,因此需要一个strong/retain属性

@interface MyTextFieldPrivateDelegate: NSObject<UITextFieldDelegate>
@end

@interface MyTextField()
@property (nonatomic, strong) MyTextFieldPrivateDelegate *privateDelegate;
@end

@implementation MyTextField
@synthesize privateDelegate;

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

我认为格温达尔的思路是对的,所以我接受了她的答案,并对其进行了扩展。您所要做的就是在项目中包含下面的代码,然后在Interface Builder中,将类从UITextField更改为ARTextField(AR=Automatic Resigner),以获得所需的行为

我仍在尝试确定userDelegate属性声明应该是强声明还是弱声明

ARTextField.h文件:

//
//  ARTextField.h
//
//  Created by Terry Grossman on 3/21/14.
//

#import <UIKit/UIKit.h>

@interface ARTextField : UITextField <UITextFieldDelegate>

@property (nonatomic, strong) NSObject<UITextFieldDelegate> *userDelegate;

@end
//
//阿特斯菲尔德
//
//由特里·格罗斯曼于2014年3月21日创作。
//
#进口
@接口ARTextField:UITextField
@属性(非原子,强)NSObject*userDelegate;
@结束
ARTextField.m文件:

//
//  ARTextField.m
//
//  Created by Terry Grossman on 3/21/14.
//

#import "ARTextField.h"

@implementation ARTextField


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

        [super setDelegate:self];
    }
    return self;
}

-(id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self)
    {
        [super setDelegate:self];
    }

    return self;
}

-(void) awakeFromNib
{
    [super awakeFromNib];
    [super setDelegate:self];
}


// if user wants a delegate, we stash it.
- (void)setDelegate:(id<UITextFieldDelegate>)delegate
{
    if (delegate != self)
    {
        self.userDelegate = delegate;
    }
}

- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
    [textField resignFirstResponder];

    if (self.userDelegate != nil && [self.userDelegate respondsToSelector:@selector(textFieldShouldReturn:)])
    {
        return [self.userDelegate textFieldShouldReturn:textField];
    }

    return NO;
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    if (self.userDelegate != nil &&  [self.userDelegate respondsToSelector:@selector(textFieldShouldBeginEditing:)]) {
        return [self.delegate textFieldShouldBeginEditing:textField];
    }

    return YES;
}


- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (self.userDelegate != nil &&  [self.userDelegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)])
    {
        return [self.userDelegate textField:textField shouldChangeCharactersInRange:range replacementString:string];
    }

    return YES;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    if (self.userDelegate != nil &&  [self.userDelegate respondsToSelector:@selector(textFieldShouldEndEditing:)]) {
        return [self.userDelegate textFieldShouldEndEditing:textField];
    }

    return YES;
}
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    if (self.userDelegate != nil &&  [self.userDelegate respondsToSelector:@selector(textFieldShouldClear:)]) {
        return [self.userDelegate textFieldShouldClear:textField];
    }

    return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
    if (self.userDelegate != nil &&  [self.userDelegate respondsToSelector:@selector(textFieldDidEndEditing:)]) {
        [self.userDelegate textFieldDidEndEditing:textField];
    }
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    if (self.userDelegate != nil &&  [self.userDelegate respondsToSelector:@selector(textFieldDidBeginEditing:)]) {
        [self.userDelegate textFieldDidBeginEditing:textField];
    }

}


@end
//
//阿特斯菲尔德
//
//由特里·格罗斯曼于2014年3月21日创作。
//
#导入“ARTextField.h”
@实现ARTextField
-(id)initWithFrame:(CGRect)帧
{
self=[super initWithFrame:frame];
如果(自我)
{
[超级代表:自我];
}
回归自我;
}
-(id)initWithCoder:(NSCoder*)aDecoder
{
self=[super initWithCoder:aDecoder];
如果(自我)
{
[超级代表:自我];
}
回归自我;
}
-(无效)从NIB中唤醒
{
[超级awakeFromNib];
[超级代表:自我];
}
//如果用户想要一个委托,我们就把它藏起来。
-(void)setDelegate:(id)delegate
{
如果(委托!=自我)
{
self.userDelegate=委托;
}
}
-(BOOL)textField应返回:(UITextField*)textField
{
[textField resignFirstResponder];
if(self.userDelegate!=nil&&[self.userDelegate respondsToSelector:@selector(textfieldshouldlreturn:)]
{
return[self.userDelegate textField shouldReturn:textField];
}
返回否;
}
-(BOOL)textField应该开始编辑:(UITextField*)textField
{
if(self.userDelegate!=nil&&[self.userDelegate respondsToSelector:@selector(textFieldShouldBeginEditing:)]{
返回[self.delegate textField shouldbeginediting:textField];
}
返回YES;
}
-(BOOL)textField:(UITextField*)textField应更改字符范围:(NSRange)范围替换字符串:(NSString*)字符串
{
if(self.userDelegate!=nil&&[self.userDelegate respondsToSelector:@selector(textField:shouldChangeCharactersRange:replacementString:))
{
return[self.userDelegate textField:textField shouldChangeCharactersRange:range replacementString:string];
}
返回YES;
}
-(BOOL)textField应取消编辑:(UITextField*)textField
{
if(self.userDelegate!=nil&&[self.userDelegate respondsToSelector:@selector(textFieldShouldEndEditing:)]{
返回[self.userDelegate textField shouldendediting:textField];
}
返回YES;
}
-(BOOL)textField应清除:(UITextField*)textField
{
if(self.userDelegate!=nil&&[self.userDelegate respondsToSelector:@selector(textFieldShouldClear:)]{
返回[self.userDelegate textField shouldClear:textField];
}
返回YES;
}
-(void)textfielddidediting:(UITextField*)textField
{
if(self.userDelegate!=nil&&[self.userDelegate respondsToSelector:@selector(textfielddidediting:)]{
[self.userDelegate textfielddidediting:textField];
}
}
-(无效)textFieldDidBeginEditing:(UITextField*)textField
{
if(self.userDelegate!=nil&&[self.userDelegate respondsToSelector:@selector(textfielddbeginediting:)]{
[self.userDelegate textField didbeginediting:textField];
}
}
@结束

这非常简单,下面是方法:
UITextField
子类中,为
uicontroleventeditingdidenonexit
事件添加目标操作方法

[self addTarget:self action:@selector(returnPressed) forControlEvents:UIControlEventEditingDidEndOnExit];

现在,每次按下返回键时都会调用选择器。

我想对UITextField进行子类化,而不是它的委托。创建子类时,只需覆盖捕获返回键事件的方法。不能对委托进行子类化。
textFieldShouldReturn:
是发送到文本字段的委托的方法。尽管如此,我还是按照您指定的方式创建了一个子类,但按return.oh时,它不会调用
textFieldShouldReturn:
!我想这会为我的错误感到抱歉。我必须通过创建一个演示应用来检查它。我会设法找到解决办法,并尽快通知你。你能把你创建的演示代码发给我吗?不用担心,谢谢你的尝试:)我没有任何代码。。。我正在考虑制作一个将文本字段作为子视图保存的对象,它是委托,然后将它得到的所有消息转发给第二个委托对象。。但我真的更喜欢你所写的解决方案(如果可能的话:)。为什么会投反对票?这种“插入的私有委托”技术非常有用和健壮。接受!我想将您的选择器编辑为
returnPressed:
,但我想有六个字符的限制。介意我把它改成
didpress返回:
?:)
//
//  ARTextField.m
//
//  Created by Terry Grossman on 3/21/14.
//

#import "ARTextField.h"

@implementation ARTextField


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

        [super setDelegate:self];
    }
    return self;
}

-(id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self)
    {
        [super setDelegate:self];
    }

    return self;
}

-(void) awakeFromNib
{
    [super awakeFromNib];
    [super setDelegate:self];
}


// if user wants a delegate, we stash it.
- (void)setDelegate:(id<UITextFieldDelegate>)delegate
{
    if (delegate != self)
    {
        self.userDelegate = delegate;
    }
}

- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
    [textField resignFirstResponder];

    if (self.userDelegate != nil && [self.userDelegate respondsToSelector:@selector(textFieldShouldReturn:)])
    {
        return [self.userDelegate textFieldShouldReturn:textField];
    }

    return NO;
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    if (self.userDelegate != nil &&  [self.userDelegate respondsToSelector:@selector(textFieldShouldBeginEditing:)]) {
        return [self.delegate textFieldShouldBeginEditing:textField];
    }

    return YES;
}


- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (self.userDelegate != nil &&  [self.userDelegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)])
    {
        return [self.userDelegate textField:textField shouldChangeCharactersInRange:range replacementString:string];
    }

    return YES;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    if (self.userDelegate != nil &&  [self.userDelegate respondsToSelector:@selector(textFieldShouldEndEditing:)]) {
        return [self.userDelegate textFieldShouldEndEditing:textField];
    }

    return YES;
}
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    if (self.userDelegate != nil &&  [self.userDelegate respondsToSelector:@selector(textFieldShouldClear:)]) {
        return [self.userDelegate textFieldShouldClear:textField];
    }

    return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
    if (self.userDelegate != nil &&  [self.userDelegate respondsToSelector:@selector(textFieldDidEndEditing:)]) {
        [self.userDelegate textFieldDidEndEditing:textField];
    }
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    if (self.userDelegate != nil &&  [self.userDelegate respondsToSelector:@selector(textFieldDidBeginEditing:)]) {
        [self.userDelegate textFieldDidBeginEditing:textField];
    }

}


@end
[self addTarget:self action:@selector(returnPressed) forControlEvents:UIControlEventEditingDidEndOnExit];