在 iPhone SDK 的键盘中实现“下一个”选项

Posted

技术标签:

【中文标题】在 iPhone SDK 的键盘中实现“下一个”选项【英文标题】:Implementing the 'next' option in the keyboard for iPhone SDK 【发布时间】:2010-01-03 01:04:35 【问题描述】:

当用户选择键盘上的“下一步”按钮时,我很难实现任务,然后用户被发送到下一个文本字段开始编辑。在我的示例中,我有三个文本字段。这是我所做的,希望你能告诉我我哪里出错了。请记住,我几周前刚拿起 SDK,所以这可能是问题的一部分:)

在我的 ViewControler.h 文件中,我创建了以下方法

-(IBAction)nextPressed:(id) sender;

在我的 ViewController.m 文件中,我创建了以下操作

-(IBAction)nextPressed:(id) sender 

    if ([txtUserName isFirstResponder]) 
    
        [txtUserName2 becomeFirstResponder];
    
    if ([txtUserName2 isFirstResponder]) 
    
        [txtUserName3 becomeFirstResponder];
    

在我的 .xib 文件中,我已将第一个文本字段(右键单击文本字段并拖动到文件所有者并选择事件下的 'nextPressed:' 选项)链接到我的文件所有者。我曾尝试仅链接到第一个文本字段,但当这对所有三个文本字段都不起作用时。我也尝试过不链接到文件所有者而是链接到一个文本字段的第一响应者,然后是所有文本字段,但没有成功。此外,对于每个文本字段,我都将返回键选择为“NEXT”。

现在,当我构建/运行时,我可以编辑文本字段并在右下角看到“下一步”按钮,但它不会将我移动到下一个字段。

我在这里做错了什么?我使用了这篇文章 (How do you change the UIControl with focus on iPhone?) 中的说明,但这里似乎遗漏了一些巨大的东西。

对此的任何帮助将不胜感激。在过去的四个小时里,我一直在盯着这个,并在谷歌上搜索我能想到的每一个可能的搜索词,但我无法轻易地围绕完成此任务所需的步骤。再次,帮助将非常有帮助:)

【问题讨论】:

【参考方案1】:

我认为您不需要定义单独的选择器 nextPressed: - 相反,实现 UITextFieldDelegate 协议方法 textFieldShouldReturn: 看起来像:

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
    if(textField == txtUserName) 
        [txtUserName2 becomeFirstResponder];
     else if(textField == txtUserName2) 
        [txtUserName3 becomeFirstResponder];
    
    return NO;

该特定方法会监视 Enter 键(在您的情况下为 Next 键)被按下的时间。实现后,只需将三个文本字段中的每一个的委托设置为实现类(可能是您的视图控制器),就可以了。

【讨论】:

在 IB 中,我实际上是从文本字段链接到 FileOwner 还是 First Responder?是否只是右键单击第一个文本字段,拖动到 FileOwner 并选择 OUTLETS 下的“委托”? 选择每个文本字段,然后对于delegate 出口,将其拖动并链接到文件所有者。 (还要确保文件所有者的类属性设置正确。) 感谢蒂姆的帮助。我到了那里,但遇到了问题。第一个文本字段工作正常,当我单击下一步时,它允许我转到下一个字段。但是,一旦我尝试在第二个字段上单击下一步,我就会在此处找到错误 (screencast.com/t/ZjVkN2Vk)。这也是它的视频(screencast.com/t/OGJjMTM5MTA)。这是我与代表 (screencast.com/t/MDNhY2Q3N) 相关联的字段的照片。想我在这里做错了什么? 请注意,textFieldShouldReturn: 方法本身需要返回一个BOOL——即YESNO。尝试将语句 return NO; 添加到方法的末尾(在所有 if 块之外),如我上面的答案所示。 啊哈!我完全忽略了这一点。所以现在看来​​每个人都在工作。但是,当我尝试从第二个文本字段移动到第三个文本字段时,它停在我身上并返回 Xcode,但没有错误。但是,当我返回 Build/Run 并从第三个文本字段开始时,它对其余字段非常有效。这是我的代码或 IB 中的错误吗? (screencast.com/t/Y2UyNDRlZjM) 如此接近,非常感谢您的帮助。【参考方案2】:

您可以使用以下代码......

分配 returnKeyType 属性

@property(nonatomic) UIReturnKeyType returnKeyType;  

UITextField *myTextField; // your textfield..
myTextField.returnKeyType = UIReturnKeyNext;

您可以将以下类型分配给虚拟键盘的返回键

typedef enum 
UIReturnKeyDefault,
UIReturnKeyGo,
UIReturnKeyGoogle,
UIReturnKeyJoin,
UIReturnKeyNext,
UIReturnKeyRoute,
UIReturnKeySearch,
UIReturnKeySend,
UIReturnKeyYahoo,
UIReturnKeyDone,
UIReturnKeyEmergencyCall,
 UIReturnKeyType;

【讨论】:

【参考方案3】:

您应该将每个文本字段 delegate 设置为您的视图控制器。然后,在您的视图控制器中,实现UITextFieldDelegate。最后,只需将以下函数添加到您的视图控制器 .m 文件中:

- (BOOL)textFieldShouldReturn:(UITextField *)textField

    if (textField == txtUsername)
        [txtUsername2 becomeFirstResponder];
    else if (textField == txtUsername2)
        [txtUsername3 becomeFirstResponder];

我认为您的错误之处在于将其视为您连接到的事件。相反,您需要在代码中的某处实现此委托,并告诉您的 UITextField 哪个类是它的委托。

【讨论】:

所以委托是在应用后台发生的事情? 委托是一个可以实现一些通常由协议定义的回调方法的对象。我认为这些方法通常在主线程上调用。 gerry3:方法从调用者正在执行的任何线程中调用;对于 UIKit 对象,这通常是主线程,但委托作为一种模式可以发生在任何线程上。【参考方案4】:

上面的蒂姆在控球。这对我也有用!我用多个键盘实现了以下内容。

在您的 ViewController.m 中:

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
    if(textField == txtCoffeeName) 
        [txtCompanyName becomeFirstResponder];

     else if(textField == txtCompanyName) 
        [txtPrice becomeFirstResponder];
    
    return NO;

【讨论】:

是的,蒂姆是个天才。如果他能回答我关于以编程方式创建数字的逆运算的问题.....

以上是关于在 iPhone SDK 的键盘中实现“下一个”选项的主要内容,如果未能解决你的问题,请参考以下文章

iPhone SDK:TextView,横向模式下的键盘

iphone sdk中mapkit中的路线信息

XE7 Update 1 选 iOS 8.1 SDK 发布 iPhone 3GS 实机测试

iPhone登录屏幕数字键盘

在 iPhone SDK 中显示 UIPickerView 时隐藏 UITabBar

UITextField 编辑问题 - iPhone SDK