2012-02-13 2 views
0

MY 프로그램은 간단한 계산기입니다. 기본 뷰는 CalcViewController.h/.m에 연결됩니다. 계산기 하단에는 버튼이 표시된 하위 뷰의 상위 100 개 점이 있습니다. 사용자가 표시중인 하위보기 단추를 클릭하면 나머지 하위보기가 입력 번호가 표시되는 레이블의 맨 아래까지 슬라이드됩니다. 하위 뷰 (AdvancedView)에는 현재 다른 버튼 하나만 있습니다 (sqrt). 이 키를 누르면 현재 레이블에있는 숫자를 가져 와서 모델에 전송하여 제곱근 방법을 수행하려고합니다. 내가 가지고있는 유일한 문제는 UILabel IBOutlet * 디스플레이가 내 AdvancedView가 아닌 ​​내 CalViewController에 설정되어 있다는 것입니다. 필자는 내 AdvancedView.h에 CalcViewController.h 가져 오기 다음 CalcViewController에 *의 MAINVIEW 포인터를 합성 시도했지만 디스플레이의 숫자가되어 있다면 나는 내 고급보기 내에서 다른 컨트롤러에서 UILabel IBOutlet의 텍스트에 어떻게 액세스합니까?

double currentText = [self.mainView.display.text doubleValue]; 

를 호출 할 때 여전히 0.000000를 얻을. 나는 또한 그물을 많이 찾았고 여러 가지 프로토콜을 계속 사용하고 있지만이 개념을 완전히 바꿀 수는없는 듯하다. 그래서 제 질문으로 돌아가서 : 다른 컨트롤러 클래스에서 UILabel IBOutlet * 디스플레이의 텍스트에 어떻게 액세스합니까?

CalcViewController.h

#import <UIKit/UIKit.h> 
@interface CalcViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UILabel *display; 
@end 

CalcViewController.m

#import "CalcViewController.h" 
#import "CalculatorBrain.h" 
#import "AdvancedView.h" 

@interface CalcViewController() 
@property (nonatomic) BOOL userIsInTheMiddleOfTyping; 
@property (nonatomic, strong) CalculatorBrain *brain; 
@property (nonatomic, strong) AdvancedView *myNewView; 
@end 

@implementation CalcViewController 
@synthesize display = _display; 
@synthesize userIsInTheMiddleOfTyping = _userIsInTheMiddleOfTyping; 
@synthesize brain = _brain; 
@synthesize myNewView = _myNewView; 
- (AdvancedView *) myNewView 
{ 
    if (!_myNewView) _myNewView = [[AdvancedView alloc] initWithFrame:CGRectMake(0, 489, 320, 200)]; 
    return _myNewView; 
} 
- (void)setMyNewView:(AdvancedView *)myNewView 
{ 
    NSLog(@"what the duece"); 
} 
- (void)subView 
{ 
    int advancedTag = 199998; 
    self.myNewView.tag = advancedTag; 

    if (![self.view viewWithTag:advancedTag]) { 
     [self.view addSubview:self.myNewView]; 

    } 
} 
- (void)viewDidAppear:(BOOL)animated 
{ 
    // Show the top 100 of AdvancedView 
    [super viewDidAppear:animated]; 
    [self subView]; 

    CGRect newFrame = self.myNewView.frame; 
    newFrame.origin.y = 480-75; 
    self.myNewView.frame = newFrame; 
    NSString *testText = self.display.text; 
    NSLog(@"The test text is %@", testText); 

} 
- (CalculatorBrain *)brain 
{ 
    if (!_brain) _brain = [[CalculatorBrain alloc] init]; 
    return _brain; 
} 
- (IBAction)digitPressed:(UIButton *)sender { 
    NSString *digit = [sender currentTitle]; 
    if (self.userIsInTheMiddleOfTyping) 
    { 
     self.display.text = [self.display.text stringByAppendingString:digit]; 
    } else { 
     self.display.text = digit; 
     self.userIsInTheMiddleOfTyping = YES; 
    } 
} 
- (IBAction)operationPressed:(UIButton *)sender { 
    [self.brain pushOperandOne:[self.display.text doubleValue]]; 
    [self.brain pushOperator:sender.currentTitle]; 
    self.userIsInTheMiddleOfTyping = NO; 
} 
- (IBAction)enterPressed { 
    [self.brain pushOperandTwo:[self.display.text doubleValue]]; 
    // self.userIsInTheMiddleOfTyping = NO; 
    double result = [self.brain execute]; 
    NSString *resultString = [NSString stringWithFormat:@"%g", result]; 
    self.display.text = resultString; 

} 
- (IBAction)clear { 
    self.display.text = @"0"; 
    self.userIsInTheMiddleOfTyping = NO; 
    [self.brain cleadLastCalculatedValue]; 
} 
@end 

AdvancedView.h

#import <UIKit/UIKit.h> 

@interface AdvancedView : UIView 
@end 

AdvancedView.m

: 여기에 내가 함께 일하고 있어요 코드입니다
#import "AdvancedView.h" 
#import "CalculatorBrain.h" 
#import "CalcViewController.h" 

@interface AdvancedView() 
@property (nonatomic) BOOL toggleTheView; 
@property (nonatomic, strong) CalculatorBrain *subBrain; 
@property (nonatomic, strong) CalcViewController *mainView; 
@end 

@implementation AdvancedView 
@synthesize toggleTheView = _toggleTheView; 
@synthesize subBrain = _subBrain; 
@synthesize mainView = _mainView; 

- (CalcViewController *)mainView 
{ 
    if (!_mainView) _mainView = [[CalcViewController alloc] init]; 
    return _mainView; 
} 
- (CalculatorBrain *)subBrain 
{ 
    if (!_subBrain) _subBrain = [[CalculatorBrain alloc] init]; 
    return _subBrain; 
} 
- (id) initWithFrame:(CGRect)rect 
{ 
    if (self = [super initWithFrame:rect]) { 
     self.backgroundColor = [UIColor groupTableViewBackgroundColor]; 

     UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     [button addTarget:self 
        action:@selector(display:) 
     forControlEvents:UIControlEventTouchDown]; 
     [button setTitle:@"Advanced features" forState:UIControlStateNormal]; 
     button.frame = CGRectMake(80.0, 10.0, 160.0, 40.0); 
     [self addSubview:button]; 

     // sqrt button 
     self.backgroundColor = [UIColor groupTableViewBackgroundColor]; 

     UIButton *sqrt = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 

     [sqrt addTarget:self 
        action:@selector(squareIt:) 
     forControlEvents:UIControlEventTouchDown]; 
     [sqrt setTitle:@"sqrt" forState:UIControlStateNormal]; 
     sqrt.frame = CGRectMake(80.0, 60.0, 160.0, 40.0); 

     [self addSubview:sqrt]; 



    } 
    return self; 
} 

- (void) squareIt:(id)sender 
{ 
    double currentText = [self.mainView.display.text doubleValue]; 
    NSLog(@"%f", currentText); 
    double result = [self.subBrain squareRoot:[self.mainView.display.text doubleValue]]; 
    NSLog(@"the text is: %f", result); 
    NSString *resultString = [NSString stringWithFormat:@"%g", result]; 
    self.mainView.display.text = resultString; 
} 

- (void) display:(id)sender 
{ 
    if (!_toggleTheView) { 

     float bottomYOfDigitToBeDisplayed = 75; 
     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDelay:0.0]; 
     [UIView setAnimationDuration:0.5]; 
     self.frame = CGRectMake(0, bottomYOfDigitToBeDisplayed, 320, 400); 
     [UIView commitAnimations]; 
     self.toggleTheView = YES; 

    } else { 
     float bottomYOfDigitToBeDisplayed = 405; 
     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDelay:0.0]; 
     [UIView setAnimationDuration:0.5]; 
     self.frame = CGRectMake(0, bottomYOfDigitToBeDisplayed, 320, 400); 
     [UIView commitAnimations]; 
     self.toggleTheView = NO; 
    } 

} 
@end 

참고 : 모델 클래스로 화면을 더 이상 차지하지 않으려 고했습니다. 그것은 단지 전형적인 모델입니다. 당신이 지금하고있는 일

답변

0

쉬운 언어로 그것을 정리해 AdvancedView

에 CalcViewController의 새로운 전망을하고있다.

  1. 당신이이 가
  2. 다음 AdvancedView에 당신이 만드는
  3. 말할 수 .. CalcViewController의 뷰를 만들어 CalcViewController은 (_mainView가) 가 B에게 말할 수 새로 만들기
  4. 당신이 원하는 것은 A의 텍스트 값입니다 ..하지만 당신은 .. 값이없는 B..whose 표시 라벨의 값을 받고
  5. 당신이 CalcViewController에게 싱글을하기 만하면 무엇

..

은 앱 수명 동안 CalcViewController의 하나의 객체 만 만듭니다.

CalcViewController.m에서 # import를 문

static CalcViewController *view; 

다음 .H 파일에 선언하는 방법을 (추가 전에 추가 ...

+ (CalcViewController *) getCalcViewController; 
{ 
    if (view == nil) 
    { 
     view = [[CalcViewController alloc] init]; 
    } 

    return view; 
} 

지금 바로

double currentText = [[CalcViewController getCalcViewController].display.text doubleValue]; 
+0

답의 첫 번째 부분은 완벽한 이해를 지금하게 사용) m에 정의. 하지만 정적 CalcViewController *보기를 가져 오기 위에 추가하고 알 수없는 형식 이름 오류가 발생했습니다. 그런 다음 getCalcViewController 클래스를 내 advancedView.h에 선언하고 오류가 발생했습니다. 예상 유형입니다. 그리고 .m에서 getCalcViewController를 정의했을 때 오류가 발생했습니다 : 정의되지 않은 식별자 'view'를 사용합니다. '보기'오류가 발생하면 내 AdvancedView에서 해당 속성을 선언해야한다고 생각합니다. 그 밖의 다른 오류는 어떻습니까? – Scott

+0

괜찮 았어 .. CalcViewController.mi의 가져 오기 문 다음에 static CalcViewController * 뷰를 추가하면 네이티브 iOS 데이터 유형과 혼동됩니다 .. 그럴 수 있습니다. 내 응답에 나머지 단계를 따르십시오. – Shubhank

+0

그래, 모든 오류를 없앴습니다. 하지만 레이블에 9를 입력하면 고급 기능 버튼을 눌러 AdvancedView를 불러 와서 sqrt 버튼을 누르십시오. 0.000은 currentText에 할당됩니다. – Scott

관련 문제