Создание подкласса NSTextField для создания текстового поля набора номера - PullRequest
1 голос
/ 09 апреля 2010

Я пытаюсь создать текстовое поле для набора номера, то есть текстовое поле, которое работает вместе с NSStepper, сидящим рядом с ним.

В текстовом поле должны отображаться числа с плавающей точкой, и пользователь может использовать колесо прокрутки для регулировки отображаемого числа, а также клавиши со стрелками вверх и вниз для того же эффекта.

Он также должен переключаться на разные приращения в зависимости от того, какие клавиши-модификаторы нажаты. Позже я мог бы реализовать поведение, когда пользователь перетаскивает курсор мыши над текстовым полем влево или вправо, нажимая alt, он будет определять, где (под какой цифрой числа) была вставлена ​​каретка вставки, и только увеличивать это число так, чтобы пользователь можно быстро обновить единицы, десятки, сотни и т. д.

Несмотря на то, что клавиши-модификаторы и детали перетаскивания мыши, скорее, просто детали, мой вопрос больше касается основ достижения этого наиболее ненавязчивым образом, так что привязки и другие функции все еще продолжают работать.

До сих пор я получил подкласс NSTextField (с форматером чисел, присоединенным к его ячейке в IB) и подкласс NSTextView для того, чтобы быть редактором поля текстового поля набора номера. Это сделано для того, чтобы я мог переопределить keyDown: чтобы происходило обновление клавиш со стрелками.

Проблема в том, что возвращение этого редактора полей для текстового поля набора номера из windowWillReturnFieldEditor: toObject: делегата окна, кажется, нарушает привязки и, как правило, кажется, что я не должен этого делать.

Я поступаю неправильно?

PS .: Вы можете найти только код подкласса в http://gist.github.com/361265 Я не был уверен, должен ли я публиковать все это здесь.

1 Ответ

0 голосов
/ 13 декабря 2011

Я использовал это в прошлом. Сначала отформатируйте номер, как в формате 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 мне очень помогли.

...