0

我正在我的应用程序中实现自定义键盘。我希望键盘适用于文本字段的多种“类型”(所有数字,但有些可以有负值与严格正数,一些整数与一些十进制值)。我想根据 textField 的“类型”隐藏一两个按钮来实现这一点。

我已经构建了键盘,并且可以将其分配为我的 textFields (xValue) 之一的 inputView。我还在键盘的 ViewController 中编写了一个方法,该方法将整数作为输入并应该修改键盘按钮。目前,此方法在我的 ViewController 的 viewDidLoad 方法中有效,但我想从初始化键盘的 ViewController 类中调用它。当我尝试调用它时,隐藏的属性没有改变。

在包含我的文本字段的 ViewController 的 viewDidLoad 中,我输入了以下内容:

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;
    }
}

当我尝试如上所述调用它时,

如上所述,如果我从 DCKeyboard 的 viewDidLoad 方法中调用它,如下所示,那么它可以工作 - 所以我确信我已经正确设置了所有内容并且代码可以正常工作。我一定只是错过了一个基本概念!

- (void)viewDidLoad {
    [super viewDidLoad];

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

2 回答 2

0

在实际需要之前,可能不会创建底层视图。在这种情况下,那是您访问属性的时候dckvc.view。因此,当您调用您的modifyKeyboardType:doneNextValue:方法时,实际上并没有隐藏视图。

您可以推迟此调用,直到您确定视图已加载,或者缓存您为键盘类型传入的值,在viewDidLoad覆盖中使用它们来更新键盘。

于 2011-08-21T16:46:58.660 回答
0

这仅仅是因为您IBOutlets没有指向任何东西,除非视图没有加载到窗口上。因此,如果您尝试修改其中的任何属性,则不会发生任何事情。

发生这种情况是因为您的 xib 文件已归档,并且在它们出现在屏幕上之前无法访问任何对象。因此,您可以在 viewDidLoad 中调用您的该方法,这是在屏幕上加载视图后调用的第一个方法,或者您可以在调用用于在屏幕上显示视图的方法后调用该方法,例如presentModalViewController:animated:pushViewController:animated:

于 2011-08-21T16:51:59.907 回答