2016-06-07 84 views
0

我将此Objective-C项目(TSCurrencyTextField)转换为Swift。它是格式化为接受货币值的UITextField子类。 This是我试图转换的.m文件。覆盖UITextField委托方法

其中,UITextField的方法shouldChangeCharactersInRangeTSCurrencyTextField类型的参数覆盖。像这样(看最后一种方法),

@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 

这是我的Swift转换。

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的方法 '文本字段:shouldChangeCharactersInRange:replacementString:' 冲突带有可选要求方法 “文本字段(:shouldChangeCharactersInRange:replacementString通过方法 '::shouldChangeCharactersInRange replacementString :)文本字段(' 提供 :)'in protocol'UITextFieldDelegate'

如何解决这个错误?

回答

0

对于Swift不是的类型和编译检查来说,Obj-c更自由,更容易。在swift中,您应该在声明时实现委托函数,而不是尝试更改任何类型。然后,您可以在执行过程中验证类型(使用if let)。

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 
}