【问题标题】:Subclassing NSTextField to create a number dialing text field子类化 NSTextField 以创建一个号码拨号文本字段
【发布时间】:2011-12-13 09:03:59
【问题描述】:

我正在尝试创建一个号码拨号文本字段,即与旁边的 NSStepper 一起工作的文本字段。

文本字段应该显示浮动,并允许用户使用滚轮来调整它显示的数字以及向上和向下箭头键以达到相同的效果。

它还应该根据按下的修饰键切换到不同的增量。 稍后我可能会实现一种行为,当用户在按下 alt 的同时将鼠标向左或向右拖动到文本字段上时,它将确定插入插入符号的位置(在数字的哪个数字),并且只增加该数字,以便用户可以快速更新个、十、百等部分。

虽然修饰键和鼠标拖动细节只是细节,但我的问题更关注以最不引人注目的方式实现这一点的基本原理,以便绑定和其他功能仍然可以继续工作。

到目前为止,我得到了一个 NSTextField 的子类(在 IB 中的单元格上附加了一个数字格式化程序)和一个 NSTextView 的子类,用作号码拨号文本字段的字段编辑器。这样我就可以覆盖 keyDown: 以使箭头键更新发生。

问题是,从窗口的委托的 windowWillReturnFieldEditor:toObject: 返回此字段编辑器用于拨号文本字段似乎会破坏绑定,并且通常感觉我不应该这样做。

我是不是走错了路?

PS.:您可以在http://gist.github.com/361265 找到子类代码 我不确定我是否应该在这里发布。

【问题讨论】:

    标签: objective-c cocoa nstextfield fieldeditor


    【解决方案1】:

    我以前用过这个。首先将数字格式化为 tel: URL 格式,如下所示:

    NSString *numberString = [@"tel://" stringByAppendingString:self.phoneLabel.text];
    

    然后我做了什么(因为我的实现涉及静态 UITableView,我检查了用户触摸的行并这样做了:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSString *numberString = [@"tel://" stringByAppendingString:self.phoneLabel.text];
    
        switch (indexPath.row) {
            case 3:
                // Phone Number Field Pressed
                [[UIApplication sharedApplication] openURL:[NSURL URLWithString:numberString]];
                break;
            case 4:
                // Send email using MailComposer
                if ([MFMailComposeViewController canSendMail]) {
    
                    MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init];
                    mailViewController.mailComposeDelegate = self;
                    [mailViewController setToRecipients:[NSArray arrayWithObject:self.emailLabel.text]];
                    [mailViewController setSubject:@""];
                    [mailViewController setMessageBody:@"" isHTML:NO];
    
                    [self presentModalViewController:mailViewController animated:YES];
    
                }
                break;
            default:
                break;
        }
    
    }
    

    您可以通过多种方式实现此功能,但使用 tel: 格式然后调用 OpenUrl 方法对我来说效果非常好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-17
      • 2014-08-29
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      相关资源
      最近更新 更多