Динамически модифицирующие представления - PullRequest
0 голосов
/ 21 августа 2011

Я использую пользовательскую клавиатуру в своем приложении. Я хочу, чтобы клавиатура была применима к нескольким «типам» textFields (все числовые, но некоторые, которые могут иметь отрицательные значения по сравнению со строго положительными, некоторые целые числа против некоторых десятичных значений). Я хочу сделать это, скрывая одну или две кнопки в зависимости от типа текстового поля.

Я построил клавиатуру и могу назначить ее как inputView одного из моих текстовых полей (xValue). Я также написал метод в ViewController моей клавиатуры, который принимает целые числа в качестве входных данных и должен изменять кнопки клавиатуры. На данный момент этот метод работает в методе viewDidLoad моего ViewController, но я хочу вызвать его из класса ViewController, в котором инициализирована клавиатура. Когда я пытаюсь вызвать его, скрытые свойства не меняются.

В viewDidLoad ViewController, который содержит мое текстовое поле, я поместил следующее:

DCKeyboard *dckvc = [[DCKeyboard alloc] initWithNibName:@"DCKeyboard" bundle:nil];
[dckvc modifyKeyboardType:0 doneNextValue:0];    // Has no effect
xValue.inputView = dckvc.view;

и в DCKeyboard.m я определил:

@synthesize doneNextButton;
@synthesize decimalButton;
@synthesize posNegButton;

-(void) modifyKeyboardType:(int)buttonTypeNumber doneNextValue:(int)doneNextNumber {

    switch (buttonTypeNumber) {
    case 0:      // Case 0: All buttons available
        decimalButton.hidden = NO;
        posNegButton.hidden = NO;
        break;
    case 1:      // Case 1: No decimal button
        decimalButton.hidden = YES;
        posNegButton.hidden = NO;
        break;
    case 2:      // Case 2: No positive/negative button
        decimalButton.hidden = NO;
        posNegButton.hidden = YES;
        break;
    case 3:      // Case 3: No decimal or positive/negative button
        decimalButton.hidden = YES;
        posNegButton.hidden = YES;
        break;
    default:
        break;
    }

    switch (doneNextNumber) {
    case 0:      // Case 0: Done
        [doneNextButton setImage:[UIImage imageNamed:@"DoneButton.png"] forState:UIControlStateNormal];
        [doneNextButton setImage:[UIImage imageNamed:@"DoneButtonDown.png"] forState:UIControlStateHighlighted];
        break;
    case 1:      // Case 1: Next
        [doneNextButton setImage:[UIImage imageNamed:@"NextButton.png"] forState:UIControlStateNormal];
        [doneNextButton setImage:[UIImage imageNamed:@"NextButtonDown.png"] forState:UIControlStateHighlighted];
        break;
    default:
        break;
    }
}

Когда я пытаюсь назвать это, как указано выше,

Как упомянуто выше, если я вызываю это из метода viewDidLoad DCKeyboard следующим образом, то он работает - так что я уверен, что все настроил правильно и код работает. Мне просто не хватает фундаментальной концепции!

- (void)viewDidLoad {
    [super viewDidLoad];

    [self modifyKeyboardType:3 doneNextValue:1]; // This works
}

Ответы [ 2 ]

0 голосов
/ 21 августа 2011

Это просто потому, что ваши IBOutlets ни на что не указывают, если представление не загружено в окно.Поэтому, если вы попытаетесь изменить какое-либо из этих свойств, ничего не произойдет.

Это происходит из-за того, что ваши xib-файлы заархивированы, и ни один из объектов не доступен, пока они не появятся на экране.Таким образом, вы можете вызвать этот метод в viewDidLoad, который является первым методом, который вызывается после загрузки представления на экран, или вы можете вызвать этот метод после вызова методов представления вашего представления на экране, например presentModalViewController:animated: или pushViewController:animated:

0 голосов
/ 21 августа 2011

Основные виды не могут быть созданы до тех пор, пока они не потребуются. В этом случае, когда вы получаете доступ к свойству dckvc.view. Таким образом, когда вы вызываете свой метод modifyKeyboardType:doneNextValue:, ни одно из представлений на самом деле не существует, чтобы быть скрытым.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...