2015-02-06 111 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; 

现在如何将其转换为斯威夫特? 或任何想法解决它?

回答

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 2015-02-09 03:33:00

+1

以防万一这种情况发生在任何人身上。不要将该方法设为私有,因为它是从其他地方调用的。我正在调试这几分钟,直到我意识到它。 :) – 2015-04-07 14:03:24

3

这是我在斯威夫特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()