5

私のアプリでは、多くのテキストフィールドを使用する必要があり、すべてのビューコントローラークラスに、面倒なテキストフィールドのデリゲートが含まれることを本当に望んでいません。テキストフィールドのデリゲートを処理するジェネリッククラスを作成したいだけです必要な場所にサブビューとして追加できるテキスト フィールドを返します。ライブラリとして作成し、テキストフィールドが必要なときはいつでもクラスを呼び出したい FOR 例

CustomTexTField *textField = [[CustomTextField alloc] initWithFrame:Frame];
// returns  a textField whose delegate will be set to CustomTextField //
// all i should do is just adding it as a subView //
[self.view addSubView:textField];

これは可能ですか??。前もって感謝します!!

4

4 に答える 4

7

Midhun Answered として、カスタム TextField クラスを作成し、そのクラスにデリゲートを設定する必要があります。このような

.h ファイル

@interface CustomTextField : UITextField<UITextFieldDelegate>
@end

.m ファイル

@implementation CustomTextField
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        self.delegate = self;
    }
return self;
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    return YES;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField{
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
    return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField{
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    return YES;
}
- (BOOL)textFieldShouldClear:(UITextField *)textField{
    return YES;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    return YES;
}
@end
于 2013-07-10T05:15:39.837 に答える
1

のサブクラスを作成してUITextField使用します。

@interface CustomTexTField : UITextField
@end

@implementation CustomTexTField

//Add the stuffs here

@end

テキストフィールドが必要な場所ならどこでも使用できます:

CustomTexTField *textField = [[CustomTextField alloc] initWithFrame:customFrame];
[self.view addSubView:textField];
于 2013-07-10T05:03:19.073 に答える
1

ブロックを使用したより良いアプローチでこれを達成できます。

class MyTextField: UITextField, UITextFieldDelegate {


//MARK:- PROPERTIES

var shouldPreventAllActions:Bool = false

var canCut:Bool = true
var canCopy:Bool = true
var canPaste:Bool = true
var canSelect:Bool = true
var canSelectAll:Bool = true

var blockTextFieldShouldChangeCharactersInRangeWithReplacementString:((_ textField: UITextField, _ range: NSRange, _ string: String) -> Bool)?
var blockTextFieldShouldReturn:((_ textField: UITextField) -> Bool)?
var blockTextFieldShouldClear:((_ textField: UITextField) -> Bool)?
//MARK:-
var blockTextFieldShouldBeginEditing:((_ textField: UITextField) -> Bool)?
var blockTextFieldShouldEndEditing:((_ textField: UITextField) -> Bool)?
//MARK:-
var blockTextFieldDidBeginEditing:((_ textField: UITextField) -> Void)?
var blockTextFieldDidEndEditing:((_ textField: UITextField) -> Void)?
var blockTextFieldDidEndEditingWithReason:((_ textField: UITextField, _ reason: UITextFieldDidEndEditingReason) -> Void)?


//MARK:- INIT
override init(frame: CGRect) {
    super.init(frame: frame)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override func awakeFromNib() {
    super.awakeFromNib()
    commonInit()
}

private func commonInit(){
    // common initialization code..
}

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {

    if(self.shouldPreventAllActions){
        return false
    }

    switch action {
    case #selector(UIResponderStandardEditActions.cut(_:)):
        return self.canCut ? super.canPerformAction(action, withSender: sender) : self.canCut
    case #selector(UIResponderStandardEditActions.copy(_:)):
        return self.canCopy ? super.canPerformAction(action, withSender: sender) : self.canCopy
    case #selector(UIResponderStandardEditActions.paste(_:)):
        return self.canPaste ? super.canPerformAction(action, withSender: sender) : self.canPaste
    case #selector(UIResponderStandardEditActions.select(_:)):
        return self.canSelect ? super.canPerformAction(action, withSender: sender) : self.canSelect
    case #selector(UIResponderStandardEditActions.selectAll(_:)):
        return self.canSelectAll ? super.canPerformAction(action, withSender: sender) : self.canSelectAll
    default:
        return super.canPerformAction(action, withSender: sender)
    }
}

//MARK:- DELEGATE

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if(self.blockTextFieldShouldChangeCharactersInRangeWithReplacementString != nil){
        return self.blockTextFieldShouldChangeCharactersInRangeWithReplacementString!(textField,range,string)
    }else{
        return true
    }
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    if(self.blockTextFieldShouldReturn != nil){
        return self.blockTextFieldShouldReturn!(textField)
    }else{
        return true
    }
}
func textFieldShouldClear(_ textField: UITextField) -> Bool {

    if(self.blockTextFieldShouldClear != nil){
        return self.blockTextFieldShouldClear!(textField)
    }else{
        return true
    }
}


//MARK:-
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {

    if(self.blockTextFieldShouldBeginEditing != nil){
        return self.blockTextFieldShouldBeginEditing!(textField)
    }else{
        return true
    }
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {

    if(self.blockTextFieldShouldEndEditing != nil){
        return self.blockTextFieldShouldEndEditing!(textField)
    }else{
        return true
    }
}

//MARK:-
func textFieldDidBeginEditing(_ textField: UITextField) {

    if(self.blockTextFieldDidBeginEditing != nil){
        self.blockTextFieldDidBeginEditing!(textField)
    }
}
func textFieldDidEndEditing(_ textField: UITextField) {

    if(self.blockTextFieldDidEndEditing != nil){
        self.blockTextFieldDidEndEditing!(textField)
    }
}
func textFieldDidEndEditing(_ textField: UITextField, reason: UITextFieldDidEndEditingReason) {

    if(self.blockTextFieldDidEndEditingWithReason != nil){
        self.blockTextFieldDidEndEditingWithReason!(textField,reason)
    }
}

}

于 2017-05-10T09:05:38.743 に答える
0

これは私を助けました

@interface CustomTextField : UITextField <UITextFieldDelegate> 

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

customTextField クラスにデリゲートを追加しましたが、うまくいきました。

ありがとう!!

于 2013-07-10T05:19:38.307 に答える