1

uitextfieldに入力された数値を自動的にフォーマットし、正しいフォーマットを返すフォーマッタークラスを作成しました。

すなわち

テキストフィールドは次のようになります$0.00

1,2,3、a、b、cと入力すると、テキストフィールドに$1.23が表示されます。

これを行うには、UITextfieldDelegateであり、textfieldsデリゲートメソッドに応答するカスタムクラスを作成しました。

ただし、このテキストフィールドのテキストが変更された場合は、ビューコントローラも応答する必要があります。

委任する必要がありますか?または、フォーマッタクラスにデリゲートメソッドも含める必要がありますか?

4

4 に答える 4

1

私がこれを解決した方法は、正しくフォーマットされた文字列を返すクラスメソッドを作成することでした。

次に、viewControllerへの委任を保持しました。

テキストフィールドを変更する必要があるかどうかを尋ねられたとき。クラスメソッドを使用してテキストを設定し、noを返すだけで、ユーザーの入力を本質的に無視します。

于 2012-08-30T19:35:04.990 に答える
1

またNSNotificationCenter、デリゲートを 2 つ使用できないため、このような状況ではを使用することをお勧めします。使用方法の例を次に示しますNSNotificationCenter

于 2012-08-30T20:22:38.627 に答える
0

いいえ、一度に 2 つのデリゲートを持つことはできません。これは 1 つのプロパティです。2 回目に割り当てると、最初のデリゲートはデリゲートではなくなります。あなたができることは、NSNotificationCenterを設定して UITextField のイベントに対応する通知を送信する共通のデリゲート クラスを作成し、すべてのクラス (これらのイベントを受信する必要がある) を NSNotificationCenter に登録することです。

于 2012-08-30T19:12:57.247 に答える
0

私はこのパーティーに少し遅れていることを認識していますが、CustomDelegate クラスを Interface Builder の VC に追加し、デリゲートをそれに設定UITextFieldしてみませんか? VC に余分なコードは必要なく、UITextFieldサブクラス化も必要ありません。以下のプロジェクトのリンクは、電話番号をカスタムフォーマットするためにこれを行います。

サンプル プロジェクトへ のリンク このリンクは、私が削除すると決定した時点で削除されます。永遠に (または Dropbox が存続している限り) 存続する可能性があります。

デリゲート クラスのコード例を追加しました (ただし、誰かが iOS 開発の経験があれば、これは必要ありません)。そのスクリーンショットは、ほぼすべての答えを説明しています。便宜上、サンプル プロジェクトのリンクを追加しました。

Delegate クラスのコード:

ヘッダー ファイル:

#import <Foundation/Foundation.h>

@interface PhoneNumberFormatterDelegate : NSObject <UITextFieldDelegate>

@end

実装ファイル:

#import "PhoneNumberFormatterDelegate.h"

@implementation PhoneNumberFormatterDelegate

#pragma mark - My Methods
-(void)textFieldDidChange:(UITextField *)textField {
    if ([textField.text length] > 11) {
        [textField resignFirstResponder];
    }
}

#pragma mark - UITextField Delegate Methods
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // If user hit the Done button, resign first responder
    if([string isEqualToString:@"\n"]){
        [textField resignFirstResponder];
        return NO;
    }

    // All digits entered
    if (range.location == 12) {
        [textField resignFirstResponder];
        return NO;
    }

    // Reject appending non-digit characters
    if (range.length == 0 &&
        ![[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[string characterAtIndex:0]]) {
        return NO;
    }

    // Auto-add hyphen before appending 4rd or 7th digit
    if (range.length == 0 &&
        (range.location == 3 || range.location == 7)) {
        textField.text = [NSString stringWithFormat:@"%@-%@", textField.text, string];
        return NO;
    }

    // Delete hyphen when deleting its trailing digit
    if (range.length == 1 &&
        (range.location == 4 || range.location == 8))  {
        range.location--;
        range.length = 2;
        textField.text = [textField.text stringByReplacingCharactersInRange:range withString:@""];
        return NO;
    }

    return YES;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    [textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}


- (void)textFieldDidEndEditing:(UITextField *)textField {
    [textField removeTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}
@end

IB スクリーンショット

于 2013-04-11T19:00:42.877 に答える