我刚开始使用xcode和objective-c并做了一些非常基本的应用程序,但我遇到的问题是非常基本的。键盘返回按钮没有隐藏键盘。
我在互联网上搜索了解决方案,所有他们说的是将委托连接到文件的所有者并添加功能,它应该可以工作,我做了,没有任何工作。
我有一个确定按钮,它正在工作,并且还点击屏幕上的任何可用空间,只需返回按钮....
我正在使用模拟器,还没有在iphone上测试。 (xcode 3.2.5使用4.2模拟器64位)。
这是应该将委托连接到每个textFiled的代码行。
1.我已经尝试过返回YES
和NO
,但没有效果。
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
也许现在我更清楚了,抱歉我之前没有这样做过。 任何人都知道我做错了什么?它应该是相当紧张的前进.....
编辑 - 添加所有元素的图像,我希望这有助于我: - )
对于每一个试图帮助的人来说,每次都是10倍....我真的很喜欢这个框架,在c ++和java,python以及其他很多东西之后它真是太棒了......我正在使用一本书,但它是为ios 3.1,也许这就是问题.....答案 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)
所以这一行很重要:
self.yourUITextFieldObject.delegate = self;
或者现在更容易使用故事板:
答案 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)