laz*_*ycs 47 interface-builder ipad ios
有没有办法(在IB或代码中)在视图中的文本字段之间设置Tab键顺序?
请注意,在按下返回(或"下一步")按钮后,我不是在谈论下一个表单字段 - 许多蓝牙键盘都有一个tab键,它似乎以完全不同的顺序循环遍历字段.在我的特定情况下,此顺序与视图中字段的位置或甚至添加字段的顺序不对应.手动修改xib文件以更改NSNextKeyView似乎也没有什么区别.
有谁知道如何更改此订单?
@sprocket的回答只是有点帮助.仅仅因为开箱即用的东西并不意味着你应该停止思考一种更好的方式 - 甚至是正确的方式 - 做某事.他注意到这种行为没有记录,但大部分时间都符合我们的需求.
但这对我来说还不够.想想RTL语言,标签仍然会从左到右标签,更不用说行为与模拟器完全不同(设备不会将第一个输入集中在标签上).最重要的是,Apple的无证实现似乎只考虑当前安装在视图层次结构中的视图.
想象一下表格形式(没有双关语)的表格视图.每个单元格都包含一个控件,因此并非所有表单元素都可以同时显示.一旦你到达最底层(屏幕上!)控件,Apple就会循环回来,而不是向下滚动.这种行为绝对不是我们想要的.
所以这就是我想出来的.您的表单应由视图控制器管理,视图控制器是响应程序链的一部分.所以你可以完全自由地实现以下方法:
#pragma mark - Key Commands
- (NSArray *)keyCommands
{
static NSArray *commands;
static dispatch_once_t once;
dispatch_once(&once, ^{
UIKeyCommand *const forward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:0 action:@selector(tabForward:)];
UIKeyCommand *const backward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:UIKeyModifierShift action:@selector(tabBackward:)];
commands = @[forward, backward];
});
return commands;
}
- (void)tabForward:(UIKeyCommand *)command
{
NSArray *const controls = self.controls;
UIResponder *firstResponder = nil;
for (UIResponder *const responder in controls) {
if (firstResponder != nil && responder.canBecomeFirstResponder) {
[responder becomeFirstResponder]; return;
}
else if (responder.isFirstResponder) {
firstResponder = responder;
}
}
[controls.firstObject becomeFirstResponder];
}
- (void)tabBackward:(UIKeyCommand *)command
{
NSArray *const controls = self.controls;
UIResponder *firstResponder = nil;
for (UIResponder *const responder in controls.reverseObjectEnumerator) {
if (firstResponder != nil && responder.canBecomeFirstResponder) {
[responder becomeFirstResponder]; return;
}
else if (responder.isFirstResponder) {
firstResponder = responder;
}
}
[controls.lastObject becomeFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)
可以应用用于预先滚动屏幕外响应者的附加逻辑.
这种方法的另一个好处是,你并不需要继承各种控件,你可能想要显示(如UITextField
S),但在控制器级别,其中,说实话可以代替管理逻辑,是在正确的地方这样做.
我有兴趣解决同样的问题,尽管到目前为止,默认顺序(似乎是从左到右,然后从上到下)是我想要的。
我测试了光标在子视图和超级视图树中以深度优先顺序移动的假设,但事实并非如此。更改子视图的顺序而不更改其位置不会更改按选项卡遍历的字段的顺序。
一个可能有用的功能是,应用程序窗口中的每个文本字段似乎都会调用文本字段委托的 textFieldShouldBeginEditing 方法。如果返回“否”,则不会选择文本字段,因此,如果您可以定义所需的顺序并仅使正确的顺序返回“是”,则可能会解决您的问题。
归档时间: |
|
查看次数: |
17885 次 |
最近记录: |