2011-08-21 237 views
0

我在我的應用程序中實現了自定義鍵盤。我希望鍵盤適用於textField的多個「類型」(所有數字,但有些可以有負值與嚴格正值,某些整數值與某些小數值)。我想通過隱藏一個或兩個按鈕來實現這一點,具體取決於textField的「類型」。動態修改視圖

我已經構建了鍵盤,並可以將其分配爲我的textFields(xValue)之一的inputView。 我也在我的鍵盤的ViewController中寫了一個方法,該方法以整數作爲輸入,並且應該修改鍵盤按鈕。目前,這種方法在我的ViewController的viewDidLoad方法中工作,但我想從初始化鍵盤的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 
} 

回答

0

底層視圖可能不會被創建,直到實際需要。在這種情況下,這是您訪問屬性dckvc.view時的情況。因此,當您撥打modifyKeyboardType:doneNextValue:方法時,實際上沒有任何視圖可以隱藏。

你可以推遲這個調用,直到你確定視圖被加載,或者緩存你傳入的鍵盤類型的值,在viewDidLoad覆蓋中使用它們來更新鍵盤。

+0

由於方法後調用該方法後調用第一個方法爲此 - 只需在初始化我的鍵盤作品後交換兩行。 – slatfats

0

這只是因爲你的IBOutlets沒有指向任何東西,除非視圖沒有加載到窗口上。所以,如果你試圖修改任何有屬性,那麼什麼都不會發生。

發生這種情況是因爲您的xib文件已存檔,並且只有它們出現在屏幕上後才能訪問任何對象。所以,你可以調用viewDidLoad中你的這種方法是視圖加載在屏幕上,也可以打電話來顯示您在屏幕上查看像presentModalViewController:animated:pushViewController:animated:

+0

感謝您的回答。我在ViewController的viewDidLoad方法中初始化我的鍵盤,該方法包含將使用我的鍵盤的textField。鍵盤在被分配爲textField的inputView時似乎是「加載」的 - 即使它沒有實際顯示 - 所以在分配後調用我的方法已解決了我的問題。 – slatfats