2015-02-06 2 views
4

Я хочу создать пользовательскую кнопку очистки на UITextField, то есть использовать RightView и поместить туда изображение, проблема заключается в прикреплении исходного события кнопки очистки к этому пользовательскому правому окну.Пользовательская кнопка «Очистить»

В Objective-C я могу сделать это так:

SEL clearButtonSelector = NSSelectorFromString(@"clearButton"); 
// Reference clearButton getter 
IMP clearButtonImplementation = [self methodForSelector:clearButtonSelector]; 
// Create function pointer that returns UIButton from implementation of method that contains clearButtonSelector 
UIButton * (* clearButtonFunctionPointer)(id, SEL) = (void *)clearButtonImplementation; 
// Set clearTextFieldButton reference to “clearButton” from clearButtonSelector 
UIButton *_clearTextFieldButton = clearButtonFunctionPointer(self, clearButtonSelector); 
[_clearTextFieldButton setImage:[UIImage imageNamed:@"icon_remove"] forState:UIControlStateNormal]; 
self.hasClearButtonAsRightView = YES; 

теперь, как преобразовать это Swift? или любые идеи обходного пути?

ответ

8

Вы можете добавить пользовательскую кнопку в правой вид UITextField как это

class CustomTextField : UITextField 
{ 
    override init(frame: CGRect) { 
     super.init(frame: frame) 

     let clearButton = UIButton(frame: CGRectMake(0, 0, 15, 15)) 
     clearButton.setImage(UIImage(named: "clear.png")!, forState: UIControlState.Normal) 

     self.rightView = clearButton 
     clearButton.addTarget(self, action: "clearClicked:", forControlEvents: UIControlEvents.TouchUpInside) 

     self.clearButtonMode = UITextFieldViewMode.Never 
     self.rightViewMode = UITextFieldViewMode.Always 
    } 

    func clearClicked(sender:UIButton) 
    { 
     self.text = "" 
    } 

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

с использованием другого пользовательского метода очистить его ..., просто, почему-то я не могу понять это, спасибо @rakeshbs – DeckyFx

+1

На всякий случай это случается с кем угодно. Не делайте метод приватным, так как его вызывают из другого места. Я отлаживал это в течение нескольких минут, пока не понял это. :) –

3

Вот мое решение в Swift 3. В дополнение к уже существующим ответ, я также уверен, что левая и правая виды текстового поля (то есть изображение изображения лупы поиска и пользовательская кнопка очистки) имеют отступы влево/вправо, переопределяя leftViewRect() и rightViewRect(). В противном случае они будут располагаться прямо по краям текстового поля.

class CustomTextField: UITextField 
{ 
    fileprivate let searchImageLength: CGFloat = 22 
    fileprivate let cancelButtonLength: CGFloat = 15 
    fileprivate let padding: CGFloat = 8 


    override init(frame: CGRect) 
    { 
     super.init(frame: frame) 
     self.customLayout() 
    } 

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

    override func leftViewRect(forBounds bounds: CGRect) -> CGRect 
    { 
     let x = self.padding 
     let y = (bounds.size.height - self.searchImageLength)/2 
     let rightBounds = CGRect(x: x, y: y, width: self.searchImageLength, height: self.searchImageLength) 
     return rightBounds 
    } 

    override func rightViewRect(forBounds bounds: CGRect) -> CGRect 
    { 
     let x = bounds.size.width - self.cancelButtonLength - self.padding 
     let y = (bounds.size.height - self.cancelButtonLength)/2 
     let rightBounds = CGRect(x: x, y: y, width: self.cancelButtonLength, height: self.cancelButtonLength) 
     return rightBounds 
    } 

    fileprivate func customLayout() 
    { 
     // Add search icon on left side 
     let searchImageView = UIImageView() 
     searchImageView.contentMode = .scaleAspectFit 
     let searchIcon = UIImage(named: "search_magnifier") 
     searchImageView.image = searchIcon 
     self.leftView = searchImageView 
     self.leftViewMode = .always 

     // Set custom clear button on right side 
     let clearButton = UIButton() 
     clearButton.setImage(UIImage(named: "search_cancel"), for: .normal) 
     clearButton.contentMode = .scaleAspectFit 
     clearButton.addTarget(self, action: #selector(self.clearClicked), for: .touchUpInside) 
     self.rightView = clearButton 
     self.clearButtonMode = .never 
     self.rightViewMode = .whileEditing 
    } 

    @objc fileprivate func clearClicked(sender: UIButton) 
    { 
     self.text = "" 
    } 
} 
3

Реализация пользовательского текстового поля, как это предлагается в других ответов не является хорошей идеей. Вы всегда должны пытаться использовать расширения, а не наследование, если это вообще возможно, потому что с наследованием вы, скорее всего, должны внести серьезные изменения в свою кодовую базу в ответ на изменения, тогда как с помощью расширений вы гораздо более гибки для изменения.

я настоятельно рекомендую, что вместо реализации пользовательского текстового поля, вы расширить класс UITextField как это:

extension UITextField { 
    func applyCustomClearButton() { 
     clearButtonMode = .Never 
     rightViewMode = .WhileEditing 

     let clearButton = UIButton(frame: CGRectMake(0, 0, 16, 16)) 
     clearButton.setImage(UIImage(name: "iCFieldClear")!, forState: .Normal) 
     clearButton.addTarget(self, action: "clearClicked:", forControlEvents: .TouchUpInside) 

     rightView = clearButton 
    } 

    func clearClicked(sender:UIButton) { 
     text = "" 
    } 
} 

Затем, чтобы использовать его просто сделать это:

yourTextField.applyCustomClearButton() 
Смежные вопросы