动态修改视图

时间:2011-08-21 16:31:09

标签: objective-c ios uiviewcontroller inputview

我正在我的应用中实现自定义键盘。我希望键盘适用于多个'类型'的textFields(所有数字,但有些可以有负值而非严格正数,有些整数与一些十进制值)。我想通过隐藏一个或两个按钮来实现这一点,具体取决于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
}

2 个答案:

答案 0 :(得分:0)

在实际需要之前,可能无法创建基础视图。在这种情况下,当您访问属性dckvc.view时。因此,当您调用modifyKeyboardType:doneNextValue:方法时,实际上不会隐藏任何视图。

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

答案 1 :(得分:0)

这只是因为你的IBOutlets没有指向任何东西,除非窗口上没有加载视图。因此,如果您尝试修改任何属性,那么什么都不会发生。

这是因为您的xib文件已存档,并且在屏幕上显示这些对象之前无法访问这些对象。因此,您可以在viewDidLoad中调用您的方法,这是在屏幕上加载视图后调用的第一个方法,或者您可以在调用方法在屏幕上显示视图后调用该方法,如presentModalViewController:animated:或{ {1}}