2011-07-10 4 views
3

リターンキーを押したときに定義済みのアクションを持つUITextFieldサブクラスを作成したいが、それ以外の点ではUITextFieldと違いはない。編集:私はいつものようにデリゲートが動作するようにしたい - これを行う方法の1つは、textFieldshouldReturn:サブクラスと実際のデリゲートに他のメッセージを送信するデリゲートを作成することですが、私は可能な限り1つのオブジェクト。デリゲートを使用せずにUITextFieldが最初のレスポンダである間にリターンキーを押す方法がありますか?

答えて

5

これは簡単です:
UITextFieldサブクラスでは、のターゲットアクションメソッドを追加しますイベント

これで、リターンキーが押されるたびにセレクタが呼び出されます。

+1

受諾済み!あなたのセレクタを 'returnPressed:'に編集したいのですが、6文字の制限があると思います。私が 'didPressReturn:'に変更したらどうしたらいいですか? :) –

-2

サブクラスでtextFieldShouldReturnメソッドをオーバーライドできます。そしてそのクラスは、通常のUItextFieldが行うすべてのことを行います。

UPDATE

@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 
+0

私はその代理人ではなく、UITextFieldをサブクラス化したいと思います。 –

+0

サブクラスを作成するときには、リターンキーイベントをキャプチャするメソッドをオーバーライドするだけで済みます。デリゲートをサブクラス化することはできません。 –

+0

@Loyal Tingleyは、コードスニペットに関する私の更新答えを見てください。 –

0

ソリューションは、あなたのUITextFieldのサブクラスは、あなたのテキストフィールドとその「通常」のデリゲート間で挿入するカスタムプライベートデリゲートを持っていることです。

あなたのプライベートデリゲートは、initWithFrame:とinitWithCoder:メソッドで作成し、デリゲートとして使用します。 UITextFieldのデリゲートプロパティはコンテンツを保持しないため、強い/保持プロパティが必要です。

@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; 
} 

間にプライベートデリゲートを挿入するには、setDelegate:をオーバーライドします。

@interface MyTextFieldPrivateDelegate: NSObject<UITextFieldDelegate> 
@property (nonatomic, weak) id<UITextFieldDelegate> delegate; 
@end 

@implementation MyTextFieldPrivateDelegate 
@synthesize delegate; 
@end 

@implementation MyTextField 
- (void)setDelegate:(id<UITextFieldDelegate>)delegate 
{ 
    if (delegate == self.privateDelegate) { 
     [super setDelegate:delegate]; 
    } else { 
     self.privateDelegate.delegate = delegate; 
    } 
} 
@end 

あなたのプライベートデリゲートは、カスタムtextFieldShouldReturnを実装します:実装、および他のすべてのUITextFieldDelegate方法

@implementation MyTextFieldPrivateDelegate 
- (BOOL)textFieldShouldReturn:(UITextField*)textField { 
    // ... 
} 

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

    return YES; 
} 

// etc. 

@end 
+0

なぜdownvotes?この「挿入されたプライベートデリゲート」手法は、非常に便利で堅牢です。 –

0

私はグエンダルは正しい軌道に乗ったと思うので、私は彼女の答えを取り、それを拡大しました。あなたのプロジェクトに以下のコードを追加し、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 

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 
関連する問題