2010-04-23 80 views
8

Tôi rất quen thuộc với việc viết các ứng dụng dựa trên VB nhưng mới vào Xcode (và Objective C). Tôi đã trải qua nhiều hướng dẫn trên web và hiểu các khái niệm cơ bản và cách tương tác với Trình tạo giao diện vv Tuy nhiên, tôi thực sự đang gặp khó khăn với một số khái niệm cơ bản về ngôn ngữ C và sẽ biết ơn bất kỳ trợ giúp nào bạn có thể cung cấp. Heres vấn đề của tôi ...Cách gọi một hàm từ một tệp lớp khác

Tôi có một ứng dụng iPhone đơn giản có bộ điều khiển xem (FirstViewController) và một chế độ xem con (SecondViewController) với tệp tiêu đề và lớp được liên kết.

Trong FirstViewController.m có một chức năng được xác định

@implementation FirstViewController 

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

Nó không thực sự có vấn đề gì các chức năng là.

Tôi muốn sử dụng chức năng này trong SecondViewController tôi, vì vậy trong SecondViewController.m tôi nhập 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]; 
} 

dòng cuối cùng này là nơi mà vấn đề của tôi là. XCode cho tôi biết rằng FirstViewController có thể không đáp ứng với writeToServer. Và khi tôi cố gắng chạy ứng dụng nó bị treo khi chức năng này được gọi.

Tôi đoán tôi không hoàn toàn hiểu cách chia sẻ chức năng và quan trọng hơn, mối quan hệ giữa các lớp học.

Trong một thế giới lý tưởng, tôi sẽ tạo một lớp toàn cầu để đặt các chức năng của mình vào và gọi chúng theo yêu cầu.

Bất kỳ lời khuyên nào được biết ơn.

+0

Bạn tốt hơn sử dụng đại biểu –

+0

Tôi đã lên bình chọn urs hy vọng để có được nó trở lại trong câu trả lời của tôi quá –

Trả lời

1

Bạn cần phải viết:

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

trong tập tin FirstViewController.h của bạn. Đây là một gợi ý cho trình biên dịch rằng hàm có sẵn cho lớp cụ thể đó. Mã của bạn sẽ vẫn hoạt động mà không có điều này, bởi vì hàm thực tế được thực thi, nhưng bạn nhận được cảnh báo vì trình biên dịch không kiểm tra tệp .m cho các hàm hiện có khi bạn đưa tiêu đề từ tệp nguồn khác.

31

Trong deklaration của phương pháp của bạn:

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

Các - vào đầu việc kê khai cho thấy, rằng nó là một phương pháp ngay lập tức. Điều này có nghĩa, bạn phải tạo một thể hiện của lớp của bạn để gọi nó. Nếu có dấu +, phương thức sẽ là phương thức lớp và bạn có thể gọi nó theo cách bạn thực hiện trong mã của mình.

Ví dụ:

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

Sau đó, trong một số chức năng:

[MyClass myClassMethod]; // This is ok 

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

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

nếu bạn muốn gọi phương pháp này như thế này chỉ có phương pháp tuyên bố writeToServer như phương pháp lớp (phương pháp tĩnh trong ngắn ...)

cho rằng bạn có kê khai và định nghĩa nó như

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

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

khác biệt duy nhất là + dấu hiệu thay vì -

  • dấu hiệu cho thấy phương pháp đó là phương pháp lớp (static) và - ký hiệu là ví dụ về phương pháp (không tĩnh)

Thứ hai tùy chọn là dụ creat của FirstViewController và gọi phương thức hiện

tức

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

Cảm ơn trả lời ih ave đã thử cả hai phương pháp bây giờ nhưng dường như không thể nhận được bất kỳ của họ để làm việc tôi tiếp tục nhận được các lỗi sau đây dưới đây SummaryViewController SummaryViewControllerObj = [[SummaryViewController alloc] init]; lỗi: Đối tượng có kích thước biến có thể không được khởi tạo lỗi: trường hợp được cấp phát tĩnh của lớp đối tượng-c 'SummaryViewController' lỗi: trường hợp được phân bổ tĩnh của lớp object-c 'SummaryViewController'and below [summaryViewControllerObj writeToServer: str]; Cảnh báo : 'SummaryViewController' có thể không phản hồi '-writeToServer:' lỗi: không thể chuyển đổi thành loại con trỏ –

2
  1. Trong file FirstViewController.h của bạn, bạn phải khai báo writeToServer như một phương pháp FirstViewController đối tượng trong @ interface phần

    @interface FirstViewController : UIViewController { 
    } 
    
    - (void) writeToServer:(NSString *) str; 
    
    @end 
    
  2. Thứ hai, thông báo sau bạn gửi không hợp lệ là FirstViewControllerwriteToServer không phải là một phương pháp lớp học và chỉ hợp lệ nếu được gọi từ sự khởi tạo của lớp FirstViewController.

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

Hoặc một cái gì đó như thế.

4

Trong dòng:

[FirstViewController writeToServer:str]; 

... bạn đang gửi thông điệp writeToServer: đến FirstViewControllerlớp. Thay vào đó, bạn cần gửi nó đến một đối tượng FirstViewController. Điều này có nghĩa rằng bạn cần để có được một tham chiếu đến một đối tượng FirstViewController và sau đó gửi các đối tượng các writeToServer: nhắn:

[firstViewControllerObject writeToServer:str]; 

Tuy nhiên, do chỉ có một cái nhìn tích cực tại một thời điểm trên iPhone, bạn không nên có các đối tượng FirstViewControllerSecondViewController cùng một lúc và giao tiếp với nhau. Thay vào đó, bạn nên tạo các lớp độc lập để thực hiện lớp được yêu cầu và bộ điều khiển chế độ xem đang hoạt động sẽ tương tác với các lớp này.

Note: "Bạn đang gửi thông điệp sayHello: đến đối tượng myObject" chỉ là một cách khác để nói phương pháp 'cũng giống như hướng đối tượng "bạn đang gọi phương thức writeToServer: của đối tượng myObject (A'. phiên bản của một hàm.)

tôi sẽ khuyên bạn nên đọc các Learning Objective-CLearn Cocoa II hướng dẫn về Cocoa Dev Central để tìm hiểu thêm về Cocoa/Objective-C và 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]; 

} 
Các vấn đề liên quan