我试图在Objective C中为UITextField对象声明以下实例属性:
@property(nonatomic) BOOL clearsOnInsertion;
我将在哪里声明并正确地将其链接到我在main.storyboard中创建的文本字段,以便在用户开始输入时它具有清除文本所需的效果?
答案 0 :(得分:1)
您可以在.h和.m文件中声明它 在.h文件中,你可以这样做
#import <Foundation/Foundation.h>
@interface ViewController : UIViewController
@property(nonatomic) BOOL clearsOnInsertion;
@property(nonatomic,strong) IBOutlet UITextField tfTextField;
@end
要在助理编辑器中连接插座转到故事板开放视图控制器类,然后按ctrl并将其拖动到所需的文本字段
在.m文件中你可以这样做
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic) BOOL clearsOnInsertion;
@end
@implementation ViewController
为了在用户开始输入时清除文本的效果,您需要在.h或.m文件中添加UITextField委托并使用.m文件中的委托方法
.h文件
#import <Foundation/Foundation.h>
@interface ViewController : UIViewController<UITextFieldDelegate>
@end
.m文件
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
clearsOnInsertion = YES;
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
clearsOnInsertion = NO;
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
clearsOnInsertion = NO;
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if(clearsOnInsertion)
{
textField.text = @""
clearsOnInsertion = NO;
}
}
答案 1 :(得分:0)
一个。一般来说:
你必须在.h文件中声明声明的属性是完全错误的:
a)您必须在接口中声明实例属性。至少有三种类型的接口:
@interface … : …
@interface …()
@interface …(…)
其中…
是班级名称。
b)没有规则必须将接口放在.h文件中。没有规则。 通常类连续符位于.m文件中。这就是它们的用途(见B)。 通常类别接口和类接口位于.h文件中。但是如果你想保留一些小的私有,那么将类接口放在.m文件中也没有错。
对于编译器来说它没有任何意义,因为它在编译开始时合并了所有包含的头文件,然后不知道源代码的来源。 (说实话,他知道更好的错误信息,但他的工作并不依赖于它。)
B中。不太通用
您必须在某个位置放置一个接口,应该读取它的人,可以读取它。由于属性通常是公共可访问的,而且.h文件是公共可读的,很明显,在许多情况下将它们放入.h是正确的选择。但是有一个私有属性的概念用于信息隐藏和封装。
℃。在你的情况下
在早些时候,IB只能读取放在.h文件中的插座。这样做的缺点是你必须公开所有网点,即使有一个私人类捆绑组合,只有IB应该访问该网点。
从版本what.ever开始,你可以把它放在.m文件中的类继续中,以保持它们的私密性。在许多情况下,这是一个不错的选择。