как показать pickerview в uitextfield не клавиатура?

Вот стандартное решение. Это похоже на ответ Лоуренса Гонсалвеса, но имеет два преимущества перед этим ответом.

  1. Это единообразно: каждая комбинация из 4 натуральных чисел, суммирующих до 40, с равной вероятностью может придумать эту схему.

и

  1. легко адаптировать к другим суммам (7 чисел, добавляющих до 100 и т. Д.)
import random

def constrained_sum_sample_pos(n, total):
    """Return a randomly chosen list of n positive integers summing to total.
    Each such list is equally likely to occur."""

    dividers = sorted(random.sample(range(1, total), n - 1))
    return [a - b for a, b in zip(dividers + [total], [0] + dividers)]

Примеры выходных данных:

>>> constrained_sum_sample_pos(4, 40)
[4, 4, 25, 7]
>>> constrained_sum_sample_pos(4, 40)
[9, 6, 5, 20]
>>> constrained_sum_sample_pos(4, 40)
[11, 2, 15, 12]
>>> constrained_sum_sample_pos(4, 40)
[24, 8, 3, 5]

Объяснение: существует взаимно-однозначное соответствие между (1) 4-мя кортежами (a, b, c, d) натуральных чисел, такими что a + b + c + d == 40, и (2) тройками целых чисел (e, f, g) с 0 < e < f < g < 40, и последнее легко получить, используя random.sample. Соответствие дается (e, f, g) = (a, a + b, a + b + c) в одном направлении и (a, b, c, d) = (e, f - e, g - f, 40 - g) в обратном направлении.

Если вы хотите неотрицательные целые числа (т. Е. Разрешить 0) вместо положительных, то есть простое преобразование: если (a, b, c, d) являются неотрицательными целыми числами, суммирующими в 40, то (a+1, b+1, c+1, d+1) суммирование натуральных чисел с суммой 44 и наоборот. Используя эту идею, мы имеем:

def constrained_sum_sample_nonneg(n, total):
    """Return a randomly chosen list of n nonnegative integers summing to total.
    Each such list is equally likely to occur."""

    return [x - 1 for x in constrained_sum_sample_pos(n, total + n)]

Графическая иллюстрация constrained_sum_sample_pos(4, 10), благодаря @FM. (Отредактировано немного.)

0 1 2 3 4 5 6 7 8 9 10  # The universe.
|                    |  # Place fixed dividers at 0, 10.
|   |     |       |  |  # Add 4 - 1 randomly chosen dividers in [1, 9]
  a    b      c    d    # Compute the 4 differences: 2 3 4 1
9
задан Rahul Vyas 28 June 2011 в 16:26
поделиться

2 ответа

Изменить: этот ответ был правильным на момент написания. С тех пор Apple представила inputView . Mafonya answer - это то, что вы должны делать в настоящее время.

Можно предотвратить всплытие клавиатуры. Сделайте свой класс делегатом UITextField: textField.delegate = self и добавьте: после объявления интерфейса (перед {) в заголовочном файле.

Теперь реализуйте textFieldShouldBeginEditing: :

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    // Show UIPickerView

    return NO;
}

Если вы хотите иметь возможность скрыть свой pickerView, этот метод не будет работать. Тогда вы могли бы создать подкласс UITextField и переопределить селекторы * trackingWithTouch: event: и творить с ними чудеса.

25
ответ дан 4 December 2019 в 05:54
поделиться

Check out the code at (there is both textview+tabbar and pickerview+tabbar code)

UITextView and UIPickerView with its own UIToolbar

this will get the pickerview to resign etc. All u need to do then is use the pickerview delegate method to update the text view

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

Instead of using a textfield, use a UIlabel, with a white background. That way the keyboard will not show when you tap it. override the touches event on the UILabel, when that happens call the method form the privious question that will display the new view.

 -(void) addToViewWithAnimation:(UIView *) theView
1
ответ дан 4 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: