Переопределение методов делегата UITextField

0

Я конвертирую этот проект Objective-C (TSCurrencyTextField) в Swift. Это подкласс UITextField отформатированный для принятия валютных значений. Это файл .m который я пытаюсь преобразовать.

В нем метод shouldChangeCharactersInRange UITextField shouldChangeCharactersInRange с параметром типа TSCurrencyTextField. Подобно этому (посмотрите на самый последний метод),

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

@implementation TSCurrencyTextField
{
    TSCurrencyTextFieldDelegate* _currencyTextFieldDelegate;
}

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

- (void) TSCurrencyTextField_commonInit
{
    // ...

    _currencyTextFieldDelegate = [TSCurrencyTextFieldDelegate new];
    [super setDelegate: _currencyTextFieldDelegate];
}

- (void) setDelegate:(id<UITextFieldDelegate>)delegate
{
    _currencyTextFieldDelegate.delegate = delegate;
}

- (id<UITextFieldDelegate>) delegate
{
    return _currencyTextFieldDelegate.delegate;
}

@end


@implementation TSCurrencyTextFieldDelegate

- (BOOL) textField: (TSCurrencyTextField *) textField shouldChangeCharactersInRange: (NSRange) range replacementString: (NSString *) string
{
    // ...
}

@end

Здесь мой быстрый переход.

protocol CurrencyTextFieldDelegate: NSObjectProtocol, UITextFieldDelegate {
    weak var delegate: UITextFieldDelegate? { get set }
}

public class CurrencyTextField: UITextField {

    override public var delegate: UITextFieldDelegate? {
        get {
            return self.delegate as? CurrencyTextFieldDelegate
        }
        set {
            self.delegate = newValue
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    private func commonInit() {

    }
}

// MARK: - CurrencyTextFieldDelegate
extension CurrencyTextField: CurrencyTextFieldDelegate {
    public func textField(textField: CurrencyTextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        return false
    }
}

Но я получаю следующую ошибку.

Objective-C method 'textField: shouldChangeCharactersInRange: replacementString:' предоставляется методом 'textField (: shouldChangeCharactersInRange: replacementString :)' конфликтует с необязательным требованием метода 'textField (: shouldChangeCharactersInRange: replacementString :)' в протоколе 'UITextFieldDelegate'

Как исправить эту ошибку?

Теги:
override
uitextfielddelegate

2 ответа

1

Для того, что вы пытаетесь выполнить, вам не нужно подклассифицировать UITextFieldDelegate.

Вместо этого в методе init добавьте цель к себе с соответствующей функцией.

override init(frame: CGRect) {
    super.init(frame: frame)
    self.addTarget(self, action: "formatText", for: .editingChanged)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.addTarget(self, action: "formatText", for: .editingChanged)
}

func formatText() {
   // Edit self.text here
}
0

Obj-c намного более свободен и прост с типами и проверками компиляции, где Swift нет. В swift вы должны реализовать функцию делегата, поскольку она объявлена, а не пытаться изменить любые типы. Затем внутри реализации можно проверить тип (используя if let).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню