如何从另一个类文件中调用函数

时间:2010-04-23 07:40:53

标签: iphone xcode function

我对编写基于VB的应用程序非常熟悉,但我对Xcode(和Objective C)不熟悉。我在网上经历了大量的教程,了解了基础知识以及如何与Interface Builder等进行交互。但是,我真的在努力学习C语言的一些基本概念,并感谢您提供的任何帮助。继承人我的问题......

我有一个简单的iphone应用程序,它有一个视图控制器(FirstViewController)和一个带有相关标题和类文件的子视图(SecondViewController)。

在FirstViewController.m中定义了一个函数

@implementation FirstViewController

- (void) writeToServer:(const uint8_t *) buf {
    [oStream write:buf maxLength:strlen((char*)buf)];   
}

功能是什么并不重要。

我想在我的SecondViewController中使用这个函数,所以在SecondViewController.m中我导入了FirstViewController.h

#import "SecondViewController.h"
#import "FirstViewController.h"

@implementation SecondViewController

-(IBAction) SetButton: (id) sender {
    NSString *s = [@"Fill:" stringByAppendingString: FillLevelValue.text];
    NSString *strToSend = [s stringByAppendingString: @":"];
    const uint8_t *str = (uint8_t *) [strToSend cStringUsingEncoding:NSASCIIStringEncoding];
    FillLevelValue.text = strToSend;

    [FirstViewController writeToServer:str];
}

最后一行是我的问题所在。 XCode告诉我FirstViewController可能不响应writeToServer。 当我尝试运行应用程序时,它会在调用此函数时崩溃。

我想我并不完全理解如何共享函数,更重要的是,类之间的关系。

在一个理想的世界中,我会创建一个全局类来放置我的函数并根据需要调用它们。

感谢任何建议。

6 个答案:

答案 0 :(得分:31)

在你的方法的deklaration:

- (void) writeToServer:(const uint8_t *) buf;

声明开头的 - 表示它是一种即时方法。这意味着,您必须创建一个类的实例来调用它。如果有+,则该方法将是一个类方法,您可以按照您在代码中的方式调用它。

示例:

@interface MyClass
{ }
 - (void) myInstanceMethod;
 + (void) myClassMethod;
@end

然后在某个功能中:

[MyClass myClassMethod]; // This is ok

//[MyClass myInstanceMethod]; // this doenst't work, you need an instance:

MyClass *theInstance = [[MyClass alloc] init];
[theInstance myInstanceMethod];

答案 1 :(得分:3)

在行中:

[FirstViewController writeToServer:str];

...您正在将消息writeToServer:发送到FirstViewController 。相反,您需要将其发送到FirstViewController 对象。这意味着您需要获取对FirstViewController对象的引用,然后发送对象 writeToServer:消息:

[firstViewControllerObject writeToServer:str];

但是,由于iPhone上一次只有一个活动视图,因此您不应同时存在FirstViewControllerSecondViewController个对象并相互通信。相反,您应该创建独立的类来执行所需的类,并且活动视图控制器应该与这些类进行交互。

注意 :“您正在向对象sayHello:发送消息myObject”只是另一种说法“你”正在调用对象writeToServer:的{​​{1}}方法。(“方法”就像函数的面向对象版本。)

我建议您阅读Learning Objective-C上的Learn Cocoa IICocoa Dev Central教程,详细了解Cocoa / Objective-C和object-oriented programming

答案 2 :(得分:2)

  1. FirstViewController.h文件中,您必须在@interface部分声明writeToServer作为FirstViewController对象的方法

    @interface FirstViewController : UIViewController {
    }
    
    - (void) writeToServer:(NSString *) str;
    
    @end
    
  2. 其次,您发送的以下消息无效,因为FirstViewController writeToServer不是类方法,仅在从FirstViewController类的实例化调用时才有效。< / p>

    FirstViewController *firstViewCnt = [[FirstViewController alloc] init];
    [firstViewCnt writeToServer:str];
    [firstViewCnt release];
    
  3. 或类似的东西。

答案 3 :(得分:1)

你需要写:

- (void) writeToServer:(const uint8_t *) buf;
在您的FirstViewController.h文件中

。这是编译器的提示,该函数可用于该特定类。如果没有这个代码,你的代码仍然可以正常工作,因为实际的函数是实现的,但是你得到了警告,因为当你包含来自另一个源文件的头文件时,编译器不会检查.m文件中的现有函数。

答案 4 :(得分:0)

如果要像这样调用此方法,只需将writeToServer方法声明为类方法(简称静态方法...)

为此您已声明并将其定义为

+ (void) writeToServer:(const uint8_t *) buf;

+ (void) writeToServer:(const uint8_t *) buf {
    [oStream write:buf maxLength:strlen((char*)buf)];   
}

唯一的区别是 + 符号,而不是 -

  • 符号表示该方法是类方法(静态) 和 - 符号是例如方法(非静态)

第二个选项是FirstViewController的creat实例,并调用现有方法

FirstViewController FirstViewControllerObj = [[FirstViewController alloc] init];
 [FirstViewControllerObj writeToServer:str];

答案 5 :(得分:0)

  

FirstViewController.h

@interface FirstViewController: UIViewController
- (void)GetItNow;
  

FirstViewController.m

- (void)GetItNow{
    NSLog(@"I acheived");    } 

  - (IBAction)goToSecondView:(id)sender {

    SecondViewController* Second= [[SecondViewControlleralloc] initWithNibName:@"SecondViewController" bundle:nil];
    rqVC.addId = self.addId;
    [self.view addSubview:Second.view];

}
  

SecondViewController.h

@property (nonatomic, assign) id delegate;
  

SecondViewController.m

- (IBAction)Action_LoadFunds:(id)sender {
    [self.view removeFromSuperview];
    [_delegate GetItNow];

}