2011-08-21 5 views
0

내 앱에서 맞춤 키보드를 구현하고 있습니다. 나는 키보드를 textFields의 여러 '유형'(모든 숫자이지만, 음수 값 대 엄격히 양수, 일부 전체 숫자 대 소수 값을 가질 수있는 유형)에 적용 할 수 있습니다. textField의 '유형'에 따라 하나 또는 두 개의 버튼을 숨겨서이 작업을 수행하고 싶습니다.뷰를 동적으로 수정하기

나는 키보드를 만들었으므로 그것을 내 textFields (xValue) 중 하나의 inputView로 할당 할 수 있습니다. 정수를 입력으로 사용하는 키보드의 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; 
    } 
} 

나는이 전화를 할 때 나는 다음과 같은 넣어 가지고 내 텍스트 필드를 포함하는의 ViewController의의 viewDidLoad에서

위와 같이,

위에서 언급했듯이 내가 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

답변 해 주셔서 감사합니다. 키보드를 사용할 textField가 포함 된 ViewController의 viewDidLoad 메서드에서 키보드를 초기화합니다. 키보드는 실제로 표시되지는 않지만 textField의 inputView가 될 때 '로드'된 것 같습니다. 그래서이 할당 후에 내 메서드를 호출하면 문제가 해결됩니다. – slatfats

관련 문제