2012-07-22 63 views
0

我正在制作一个计算器,并且有一个称为CalculatorBrain的类,名为CalculatorFirstViewController的数学部分有两个MVC。图表部分的另一个称为GraphViewController。作品,但我不知道为什么,目标c

在CalculatorController中,我使用mutableArray作为计算器堆栈,并通过segue将它传递给图形视图控制器。 GraphView的属性称为graphingPoints。之后,通过drawrect并调用“programToGraph”方法,该方法将创建一个图形点的数组。令我困惑的是我在“programGraph”中调用了一个方法“runProgram:usingVariableValues”,虽然“runProgram”只在CalculatorBrain中声明,它是一个单独的对象文件。为什么这个方法调用工作?

@interface CalculatorFirstViewController() 
@property (nonatomic, strong) CalculatorBrain *brain; 
@end 

@implementation CalculatorFirstViewController 
@synthesize brain = _brain; 

- (CalculatorBrain*) brain{ 
    if(!_brain) _brain = [[CalculatorBrain alloc] init]; 
    return _brain; 
} 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 

    if([segue.identifier isEqualToString:@"Graph"]) 
    //The call [self.brain program] returns the CalculatorStack 
    [segue.destinationViewController setGraphingPoint:[self.brain program]]; 
    } 

这里是RunProgram的声明,它是在Calculator MVC中使用的CalculatorBrain对象中声明的。它是一个类方法。它所做的只是返回在堆栈上执行操作的值。

+ (double)runProgram:(id)program usingVariableValues:(NSDictionary*)variableValues; 

这是graphViewController代码。

-(void) setGraphingPoint:(NSMutableArray*) graphingPoint{ 

if(_graphingPoint == nil) _graphingPoint = [[NSMutableArray alloc] init ]; 
    _graphingPoint = graphingPoint; 
    //this will call drawrect 
    [self.graphingView setNeedsDisplay]; 
} 


-(id) programToGraph:(GraphingView *)sender{ 

    CGPoint graphPoint; 
    NSMutableArray *pointValues = [[NSMutableArray alloc] init]; 

    for(int x =0;x<5; x++) 
    { 
     NSDictionary* xValue = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:x] forKey:@"X"]; 
     graphPoint.x =x; 

    //This is the main part I dont get, If calculatorBrain is a seperate object file 
    //and I didn't import it, how am I able to call the method by just saying 
    //CalculatorBrain as the receiver? 

     graphPoint.y = [CalculatorBrain runProgram: self.graphingPoint usingVariableValues:xValue]; 

     [pointValues addObject:[NSValue valueWithCGPoint:graphPoint]]; 

} 

return pointValues; 

} 

那么怎么来的,我可以打电话runProgram虽然我没有导入CalculatorBrain文件,我没有通过SEGUE传递到另一个控制器?

+0

你意识到你必须在m或h中导入这个东西,因为你可以访问CalculatorBrain类。或者你有一个前向引用(@class),但是然后CLANG会抱怨它。 – CodaFi 2012-07-22 22:56:07

+0

我没有将任何CalculatorFiles导入到graphingController中,但我没有将CalculatorController导入到CalculatorControlelr中以便能够调用Segue。我以为你必须保持MVC分开 – 2012-07-22 23:21:53

+0

你有没有什么课程? – CodaFi 2012-07-22 23:23:39

回答

0

Objective-c允许调用对象上的选择器(方法)而不需要声明。这是因为实际的调用是在运行时查找的。这允许您的代码在其他库中实现的类中具有扩展方法,因为在需要时会在运行时找到调用,而不是在编译时。

因此,您的调用在运行时查找并正常工作,因为方法存在。在这种情况下,编译器应该给出一个警告,提示该方法在编译时没有找到,但仍然会成功编译。

编辑:您仍然需要使用@class转发声明类本身。

+0

那些setters和getters是不是那些技术上的方法?如果是的话,如果我仍然可以在任何我想要的地方打电话,为什么我需要通过segue传递信息? – 2012-07-22 23:14:33

+0

“Objective-c允许调用对象上的选择器(方法)而不需要声明”绝对不是这样。编译器会一直抱怨timbuktu,如果你试图在没有'-performSelector:' – CodaFi 2012-07-22 23:25:18

+0

的情况下远程执行任何操作,如果我将GraphingViewController导入到CalculatorController中来调用segue中的setter,这将允许graphingViewController使用CalculatorViewController中的方法? – 2012-07-22 23:42:32

相关问题