不为UITextField的对象调用方法

时间:2015-03-06 11:49:25

标签: ios objective-c

我创建了一个我想在UITextField上调用的方法。这是方法:

- (void)addBorderLayer:(UITextField *)tf{

    CALayer *border = [CALayer layer];
    CGFloat borderWidth = 2;
    border.borderColor = [UIColor redColor].CGColor;
    border.frame = CGRectMake(0, tf.frame.size.height - borderWidth, tf.frame.size.width, tf.frame.size.height);
    border.borderWidth = borderWidth;
    tf.layer.masksToBounds = YES;

}

一旦我尝试调用该方法,它就不会改变我的UITextField:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self addBorderLayer:self.emailTextField];

}

我做错了什么?

5 个答案:

答案 0 :(得分:2)

addBorderLayer:中,您需要在设置后将图层添加到文本字段:

[tf.layer addSublayer:border];

答案 1 :(得分:2)

您应该更改文本字段的图层。考虑这样的事情:

-(void) addBorderLayer:(UITextField *) tf 
{
    tf.layer.borderColor = [UIColor redColor].CGColor;
    tf.layer.borderWidth = 2;
    tf.layer.cornerRadius = 5;
}

答案 2 :(得分:2)

问题在于其他人都说你实际上并没有将图层添加到UITextField。其他答案都很好,但我认为我会分享一些似乎有点复杂的东西,但可能会让它更可重复使用,而且总是很好。

首先要为名为UIView的{​​{1}}创建一个新类别,在这里我们有以下内容:

<强>的UIView + layer.h

UIView+layer

<强>的UIView + layer.m

@interface UIView(layer)

- (void)addBorder;
- (void)addBorderWithColor:(UIColor *)color;
- (void)addBorderWithColor:(UIColor *)color width:(CGFloat)width;
- (void)addBorderWithColor:(UIColor *)color radius:(CGFloat)radius;
- (void)addBorderWithWidth:(CGFloat)width;
- (void)addBorderWithWidth:(CGFloat)width radius:(CGFloat)radius;
- (void)addBorderWithRadius:(CGFloat)radius;

- (void)addBorderWithColor:(UIColor *)color width:(CGFloat)width radius:(CGFloat)radius; // Essentially the one we will use

@end 

现在,如果您对类别一无所知,那么您可能想知道我们为什么要#import "UIView+layer.h" #pragma mark - Default values // Some constants for the default values CGFloat const kDefaultBorderWidth = 2.0; CGFloat const kDefaultBorderRadius = 5.0; UIColor * const kDefaultBorderColor = [UIColor blackColor]; @implementation UIView(layer) // Essentially this is the method all the others will call. - (void)addBorderWithColor:(UIColor *)color width:(CGFloat)width radius:(CGFloat)radius { CALayer *border = [CALayer layer]; border.borderColor = color.CGColor; border.frame = CGRectMake(0, self.frame.size.height - width, self.frame.size.width, self.frame.size.height); border.borderWidth = width; self.layer.masksToBounds = YES; [self addSublayer:layer]; // OR you can affect the layer it already has like with the code below instead of using the addSublayer: method // self.layer.borderColor = color.CGColor; // self.layer.borderWidth = width; // self.layer.frame = CGRectMake(0, self.frame.size.height - width, self.frame.size.width, self.frame.size.height); } #pragma mark - additional methods that you can call for setting a border - (void)addBorder { [self addBorderWithColor:kDefaultBorderColor width:kDefaultBorderWidth radius:kDefaultBorderRadius]; } - (void)addBorderWithColor:(UIColor *)color { [self addBorderWithColor:color width:kDefaultBorderWidth radius:kDefaultBorderRadius]; } - (void)addBorderWithColor:(UIColor *)color width:(CGFloat)width { [self addBorderWithColor:color width:width radius:kDefaultBorderRadius]; } - (void)addBorderWithColor:(UIColor *)color radius:(CGFloat)radius { [self addBorderWithColor:color width:kDefaultBorderWidth radius:radius]; } - (void)addBorderWithWidth:(CGFloat)width { [self addBorderWithColor:kDefaultBorderColor width:width radius:kDefaultBorderRadius]; } - (void)addBorderWithWidth:(CGFloat)width radius:(CGFloat)radius { [self addBorderWithColor:kDefaultBorderColor width:width radius:radius]; } - (void)addBorderWithRadius:(CGFloat)radius { [self addBorderWithColor:kDefaultBorderColor width:kDefaultBorderWidth radius:radius]; } @end 而不是UIView。原因是我们正在使其成为UITextField的子类并且包含UIView的所有类可重用,所以您需要做的就是执行UITextField然后您可以使用这些您#import "UIView+layer.h"实例的方法,所以在您的情况下,您现在只需执行UITextField,它将使用默认值为您的[self.emailTextField addBorder];添加边框。

我知道它看起来比其他工作要多得多,但这只是因为它更可重用于更多类的子类UITextField,并且在编码方面,可重用性总是一个代码

答案 3 :(得分:1)

尝试将代码移动到viewWillAppear,此时它应该放置其视图并且边界等是正确的。

同时将图层添加到Greg指出的文本字段中。

答案 4 :(得分:1)

您正在创建新图层,但您永远不会将其添加到ui。

您需要将其添加到目标视图的图层。

[tf.layer addSublayer:border];