【问题标题】:Dismiss iPhone keyboard triggered by a UITextField in a Subview关闭由子视图中的 UITextField 触发的 iPhone 键盘
【发布时间】:2012-08-22 10:32:04
【问题描述】:

我的ViewController包含一个子视图

UIView位于NameSubViewController(与XIB类)

子视图包含一个UITextField


我添加了这个动作:

- (IBAction)textFieldReturn:(id)sender;

NameSubViewController 类中,并将其连接到 XIB 中文件所有者的文本字段(退出时结束)。

但是当我点击返回时,日志给了我一条错误消息,并且模拟器中没有任何反应。

这是相关代码:


ViewController.h:

@property (nonatomic, strong) UIView *nameSubView;

ViewController.m (viewDidLoad):

UIViewController *nameController = [[NameSubViewController alloc] initWithNibName:@"NameSubViewController" bundle:nil];
nameSubView = [nameController view];

[self.view addSubview:nameSubView];

NameSubViewController.h:

#import <UIKit/UIKit.h>

@interface NameSubViewController : UIViewController

@property (nonatomic, strong) IBOutlet UITextField *textField;

- (IBAction)textFieldReturn:(id)sender;
//Not working.. Connected from files owner to textField with option didEndOnExit

NameSubViewController.m:

-(IBAction)textFieldReturn:(id)sender
{
[sender resignFirstResponder];
} 

当我点击返回时,我会在日志中看到这条消息:

AppName[6656:f803] -[CALayer textFieldReturn:]: unrecognized selector sent to instance 0x6e99d40 2012-08-28 02:51:26.954 AppName[6656:f803] *** WebKit discarded an uncaught exception in the webView:shouldInsertText:replacingDOMRange:givenAction: delegate: <NSInvalidArgumentException> -[CALayer textFieldReturn:]: unrecognized selector sent to instance 0x6e99d40

并且键盘不会关闭。什么可能导致我的问题?

视图控制器:

http://www.flickr.com/photos/80427098@N07/7877111708/in/photostream

NameSubViewController,ViewController的子视图中显示的视图:

http://www.flickr.com/photos/80427098@N07/7877111596/in/photostream

【问题讨论】:

  • 如果我在MainViewController 类中添加IBAction,当文本字段在另一个类中时,我无法将其连接到文本字段..
  • IBAction 文本字段中有什么代码?
  • 如果您可以将 IBOutlet 连接到另一个类中的 IBAction,我会感到非常惊讶。而且我怀疑您可以将 xib 用于 sub 视图。如果你想要一个只覆盖部分屏幕的子视图,我要么把它放在常规的 xib 中,要么以编程方式添加它(你可以与 xib 结合使用)。如果您的子视图覆盖整个屏幕,您最好将其分配给单独的视图控制器并让您的 MainViewController 呈现该控制器。我可能是错的,但如果没有人反对,那就是我会做的。
  • @Wienke 我想你误解了..我有一个用于子视图的常规 xib,带有一个 textField。

标签: iphone objective-c ios xcode


【解决方案1】:

您是否打算让代理成为 CALayer? [CALayer textFieldReturn:]

现在是。

【讨论】:

  • 我不知道为什么……有什么线索吗??
  • 这就是你设置的。 :-)
  • 我在哪里可以将代理设置为 CALayer?从来没有做过那样的事情。我在 IB 中的连接是否做错了什么,或者当我试图从子视图类中关闭键盘时我做错了什么?我没有更多的代码可能导致这种情况..
  • 您要么在 XCode(界面构建器)中完成,要么使用代码完成。如果您在描述中所说的是正确的,那么“文件的所有者”就是 CALayer。你是如何加载 xib 的?
  • XIB 的 UIView 带有 textfieldReturn 操作正在填充 ViewController 中的 nameSubView 属性
【解决方案2】:

我终于自己找到了解决方案。真的很简单,我只需要为 NameSubViewController 的UIView 创建一个类,并将 textfieldReturn 代码放在 UIView 类中:

#import <UIKit/UIKit.h>

@interface NameSubView : UIView

@property (nonatomic, strong) IBOutlet UITextField *textField;

- (IBAction)textFieldReturn:(id)sender;

@end

键盘按原样返回!有意义,因为只有 UIView 被加载为主视图的子视图,而没有子视图视图控制器。 ViewController 永远不应该是另一个视图的子视图,只有它的视图应该,所以代码必须写在子视图 UIView 类中。不是子视图 UIViewController 类!

【讨论】:

    猜你喜欢
    • 2013-08-16
    • 1970-01-01
    • 2017-03-28
    • 2011-06-13
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多