2010-04-23 35 views
8

我對編寫基於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。 當我嘗試運行該應用程序時,它調用此函數時崩潰。

我想我並不完全理解如何共享函數,更重要的是類之間的關係。

在理想的世界裏,我會創建一個全球化的課程,把我的功能放入並根據需要調用它們。

任何建議感激地收到。

+0

您更好地利用委託 – 2015-05-10 03:28:01

+0

我已經高達投URS希望把它找回來我的回答太 – 2015-06-20 14:11:17

回答

1

你需要寫:

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

在FirstViewController.h文件。這是編譯器提示函數可用於該特定類的提示。如果沒有這個,你的代碼仍然可以正常工作,因爲實際的函數已經實現了,但是你會得到警告,因爲當你從另一個源文件中包含頭文件時,編譯器不會檢查.m文件中的現有函數。

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]; 
0
如果要調用這個方法這樣才宣佈在WriteToServer方法類方法(簡稱靜態方法

...)

對你有聲明和定義它像

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

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

唯一的區別是+標誌,而不是-

  • 跡象表明,方法是類方法(靜態) 和 - 符號是例如方法(非靜態)

第二個選項是FirstViewController的科瑞實例,並調用現有方法

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

感謝回覆ih ave現在嘗試了這兩種方法,但似乎無法讓他們中的任何一個工作我不斷收到以下錯誤 下面SummaryViewController SummaryViewControllerObj = [[SummaryViewController alloc] init]; 錯誤:變量大小的對象可能未被初始化 錯誤:靜態分配的對象c類的實例'SummaryViewController' 錯誤:靜態分配的對象c類'SummaryViewController'的實例和以下[summaryViewControllerObj writeToServer:str]; 警告:'SummaryViewController'可能不會響應'-writeToServer:' 錯誤:無法轉換爲指針類型 – 2010-04-26 07:12:39

2
  1. 在你FirstViewController.h文件,你必須聲明writeToServerFirstViewController對象在@interface的方法部分

    @interface FirstViewController : UIViewController { 
    } 
    
    - (void) writeToServer:(NSString *) str; 
    
    @end 
    
  2. 其次,您發送的以下消息無效,因爲FirstViewControllerwriteToServer不是類方法,並且只有在從FirstViewController類的實例化中調用時纔有效。

    FirstViewController *firstViewCnt = [[FirstViewController alloc] init]; 
    [firstViewCnt writeToServer:str]; 
    [firstViewCnt release]; 
    

或者類似的東西。

4

在行:

[FirstViewController writeToServer:str]; 

...你要發送的消息writeToServer:到的FirstViewController類。相反,您需要將其發送到FirstViewController對象。這意味着你需要獲得一個FirstViewController對象的引用,然後發送對象writeToServer:消息:

[firstViewControllerObject writeToServer:str]; 

然而,因爲只有一個視圖處於活動狀態在iPhone上的時候,你不應該同時存在FirstViewControllerSecondViewController對象並相互通信。相反,您應該創建獨立的類來執行所需的類,並且活動視圖控制器應該與這些類進行交互。

:「你要發送的消息sayHello:對象myObject」的說法只是另一種方法‘就像是面向對象「您呼叫的對象myObjectwriteToServer:方法(A。’版本的功能。)

我會推薦閱讀Cocoa Dev CentralLearning Objective-CLearn Cocoa II教程來學習更多關於可可/ Objective-C和object-oriented programming

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]; 

} 
相關問題