委托UITextField不工作...返回按钮没有响应

时间:2010-12-14 11:05:36

标签: ios iphone objective-c ios-simulator

我刚开始使用xcode和objective-c并做了一些非常基本的应用程序,但我遇到的问题是非常基本的。键盘返回按钮没有隐藏键盘。

我在互联网上搜索了解决方案,所有他们说的是将委托连接到文件的所有者并添加功能,它应该可以工作,我做了,没有任何工作。

我有一个确定按钮,它正在工作,并且还点击屏幕上的任何可用空间,只需返回按钮....

我正在使用模拟器,还没有在iphone上测试。 (xcode 3.2.5使用4.2模拟器64位)。

这是应该将委托连接到每个textFiled的代码行。 1.我已经尝试过返回YESNO,但没有效果。 2.我已经尝试了textField的特定对象名称和这种通用方式,但是没有用。

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}

在:基本视图控制器连接中 - >连接 - >出口,我有:委托 - 文件的所有者。并且在引用出口的文件所有者中有:delegate - Round style text .....

编辑 - 之前我忘了提及,我已经检查过,方法没有被调用!!!

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
NSLog(@"Working!!!");
[textField resignFirstResponder];
return YES;

}

我该怎么做才能实现?这就是为什么人们说要连接代表,但在我的情况下,它是连接的而不是触发功能...我知道这是一个愚蠢的问题,但对于像我这样的nobie解决方案并不明显......

好的,另一个编辑 - 我的所有代码:只是无法理解该怎么做.... 这是:basicViewController.h

#import <UIKit/UIKit.h>

@interface basicViewController : <#superclass#> <UITextFieldDelegate>

@interface basicViewController : UIViewController <UITextFieldDelegate> {
//every object that we want to interact with (like text field or lable) is call an   outlet!!!!
//here we define the outlets for our program
IBOutlet UITextField *txtName;
IBOutlet UILabel *lblMessage;
 }

//here are the getters and setter for our outlets
@property (nonatomic, retain) IBOutlet UITextField *txtName;
@property (nonatomic, retain) IBOutlet UILabel *lblMessage;

//method decleration for the OK button action
- (IBAction) doSomething;



//method for hiding the keyboard when clicking on empty area in the app
   //we will put an invisible button on all area and clicking on it will make keyboard disapear
   - (IBAction) makeKeyboardGoAway;

   @end

这是basicViewController.m

 #import "basicViewController.h"

 @implementation basicViewController

 //synthesizeing the objects that we made' this will create the getter and setters automaticly
 @synthesize txtName;
 @synthesize lblMessage;

 - (IBAction) doSomething{
// makeing keyboard disapear when pressing ok button (doing that form the text field)
//when pressing the OK button, the keyboard will disapear and when clicking in the text field it will show again
[txtName resignFirstResponder];



NSString *msg = [[NSString alloc] initWithFormat:@"Hello, %@",txtName.text];

//the objective-c way for setting the test in the text field
[lblMessage setText:msg];   
//the regular object oriented way
//lblMessage.text = msg;
[msg  release];
 }    

 - (IBAction) makeKeyboardGoAway{
[txtName resignFirstResponder];
 } 

 //when clicking the return button in the keybaord
 - (BOOL)textFieldShouldReturn:(UITextField *)textField{
NSLog(@"Working!!!");
[textField resignFirstResponder];
return YES;
 }


 - (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
 }

 - (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
 }


 - (void)dealloc {
     [super dealloc];
 }

 @end

也许现在我更清楚了,抱歉我之前没有这样做过。 任何人都知道我做错了什么?它应该是相当紧张的前进.....

编辑 - 添加所有元素的图像,我希望这有助于我: - ) alt text

对于每一个试图帮助的人来说,每次都是10倍....我真的很喜欢这个框架,在c ++和java,python以及其他很多东西之后它真是太棒了......我正在使用一本书,但它是为ios 3.1,也许这就是问题.....

10 个答案:

答案 0 :(得分:31)

首先,您应该通过在方法开头添加NSLog语句或断点来检查是否实际调用textFieldShouldReturn:

一旦完成,请尝试手动声明视图控制器符合接口文件中的<UITextFieldDelegate>协议:

@interface YourClass : ... <UITextFieldDelegate>

同时声明一个属性&amp;您UITextField的插座,在IB中建立适当的连接,并手动将self作为UITextField代表声明:

self.yourUITextFieldObject.delegate = self;

完成后,查看上面的方法是否正在调用,并确保返回YES。

答案 1 :(得分:6)

只需在

中写一行
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
}

返回YES之前; 最终版本如下:

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
    return YES;
}

-(void)textFieldDidEndEditing:(UITextField *)textField{

    NSLog(@"%@",textField.text);
}

答案 2 :(得分:3)

您需要将文本字段的委托分配给文件所有者。文本字段正在发送消息,但没有委托来响应它。

使用界面构建器执行此操作。 你必须实现这个方法..

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
  [textField resignFirstResponder];
  return YES;
}

答案 3 :(得分:2)

像Rog说的那样,不要忘记将文本字段注册到代表,你可以按照他的说法手动完成,但是在Storyboard中你可以控制从所有文本字段拖动到视图控制器并注册代理(选择代表)。只有注册的文本字段才能使用所有这些方法。

所以这一行很重要:

self.yourUITextFieldObject.delegate = self;

或者现在更容易使用故事板:

enter image description here

答案 4 :(得分:1)

上写日志
- (IBAction) makeKeyboardGoAway

功能。每次在屏幕上点击任何东西时,我认为它都是这种方法。在这种情况下,您需要将触摸事件发送到文本字段。不知道这是怎么做的,但应该这样做。 否则尝试删除整个视图中的点击(点击),并尝试做你正在做的事情。

答案 5 :(得分:1)

最有可能的问题是,正在运行的应用程序中的实际视图控制器不是“basicViewController”,而是未实现UITextFieldDelegate协议的UIViewController。

通过选择类“basicViewController”在接口构建器中完成了什么,因为FilesOwner只是声明正在运行的应用程序中的FilesOwner对象是basicViewController类型;实际对象是由此声明实例化,在您的情况下,它不在xib / nib中。

代码的其他部分实际上实例化了一个视图控制器对象并加载了xib / nib文件。在那个地方,我想你的代码是实例化UIViewController(通常是自动生成的代码),而不是basicViewController的实例;你只需要改变那里的课程。

此外,在Interface Builder中使用UINavigationController或UITabBarController时(通常应该)配置为实例化并加载其他自定义视图时,通常会发生此错误。如果您使用这样的更高级别的控制器,请仔细检查它是否实际配置为使用basicViewController,而不是从xib / nib加载视图时使用UIViewController。

希望,这解决了这个问题!

答案 6 :(得分:1)

textfield在子视图中?在这种情况下,请确保textfield具有委托FileOwner。

答案 7 :(得分:0)

你能试试吗..

@interface ClassName : SuperClass < UITextFieldDelegate >

答案 8 :(得分:0)

像这样使用......

textfield.delegate=self;

并使用.h类中的UITextFieldDelegate

答案 9 :(得分:0)

当您甚至不知道文本字段位于哪个视图时,您可以随时关闭键盘:

<强>目标-C:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) 
                                           to:nil 
                                         from:nil 
                                     forEvent:nil];

<强>夫特:

UIApplication.sharedApplication().sendAction("resignFirstResponder", 
                                           to:nil, 
                                         from:nil, 
                                     forEvent:nil)