2012-03-16 37 views
7

Đây là một câu hỏi rất cơ bản nhưng tôi đã tìm kiếm tất cả và không thể tìm thấy câu trả lời giải thích đủ để tôi có thể xoay quanh nó.Cách gọi phương thức từ lớp này sang lớp khác (iOS)

Điều tôi muốn làm là tạo phương thức trong một lớp ứng dụng iOS của mình và sau đó gọi phương thức đó từ các lớp khác trong ứng dụng của tôi. Ai đó có thể giải thích chính xác những gì tôi cần làm để đạt được điều này? Bất kỳ trợ giúp nào cũng sẽ được đánh giá rất cao vì tất cả nỗ lực của tôi cho đến nay đã thất bại!

Cảm ơn.

+2

Tôi nghĩ câu hỏi của bạn hơi mơ hồ. Bạn sẽ làm điều này trong bất kỳ ứng dụng cơ bản nào. I E. gọi phương thức trên đối tượng. Bạn có thể đưa ra các mẫu mã cho thấy những gì bạn đang cố gắng làm không? – drekka

+0

Bạn có thể sử dụng NSNotificationCenter hoặc Delegates hoặc giao thức tùy chỉnh của bạn .... –

Trả lời

43

Objective-C:

Bạn phải nhập tiêu đề của lớp chứa phương thức mà bạn muốn sử dụng (ClassYouWantToUse.h) vào lớp học mà bạn muốn sử dụng nó ở (TargetClass).

Bên trong TargetClass.h hoặc TargetClass.m (tùy thuộc vào phạm vi mà bạn muốn để cho nó):

#import "ClassYouWantToUse.h" 

Sau đó tạo một thể hiện của lớp bạn muốn sử dụng bên trong lớp mục tiêu hoặc là một bất động sản như thế này:

@property (nonatomic,strong) ClassYouWantToUse *classObject; 

Hoặc như là một biến Ví dụ như thế này:

ClassYouWantToUse *classObject; 

Hãy chắc chắn rằng bạn khởi tạo nó! (Thường là bên trong viewDidLoad):

classObject = [[ClassYouWantToUse alloc] init]; 

Bây giờ bạn có thể gọi bất kỳ phương pháp nào từ lớp đó như thế này:

[classObject theClassMethodWithParam:param1 andSecondParam:param2]; 

Lưu ý: Lớp ClassYouWantToUse phải có các phương pháp mà bạn muốn thực hiện truy cập cho người khác bằng cách tuyên bố họ trong tệp tiêu đề:

- (void)theClassMethodWithParam:(UIImage*)someImage andSecondParam:(NSString*)someText; 

Nếu không, bạn sẽ không thể thấy các phương pháp này.


Swift:

Theres thực sự không có gì đặc biệt về nó trong nhanh chóng, chỉ cần thêm này như một tài liệu tham khảo.

Trong nhanh chóng bạn chỉ cần tạo một thể hiện của lớp bạn muốn sử dụng:

let classObject = ClassYouWantToUse() 

Và sử dụng nó trực tiếp:

classObject.theClassMethodWithParam(param1, andSecondParam:param2) 
+0

Cảm ơn bạn ** rất nhiều **! Bạn không thể tưởng tượng có bao nhiêu bài viết tôi đã đọc cố gắng tìm ra điều này. Làm việc như tôi muốn ngay bây giờ! –

+0

Luis Oscar, bạn là người đàn ông đẹp! – Ian

+0

Tò mò là giải pháp thích hợp để có hai phiên bản ClassToBeUsed là gì? Bởi vì * một cái gì đó không giống như tự trở lại trong ClassToBeUsed? Vì vậy, trong ví dụ này, nếu tôi sẽ tự tham chiếu đến [something somethingWithParam: blabla vàSecondParam: otherbla] nó sẽ tham chiếu * một cái gì đó. Nếu tôi cần tham khảo bản gốc của ClassToBeUsed thì sao? – rick

3

Bạn có hai lựa chọn cơ bản. Bạn có thể tạo hoặc truyền vào một cá thể của lớp đầu tiên đến lớp thứ hai, hoặc bạn có thể thêm một phương thức tĩnh vào lớp đầu tiên và gọi nó trực tiếp bằng cách sử dụng đối tượng lớp.

Ví dụ, nói rằng bạn có:

@interface ClassA : NSObject { 
} 

//instance methods 
- (int) addNumber:(int)num1 withNumber:(int)num2; 

//static/class methods 
+ (int) add:(int)num1 with:(int)num2; 
@end 

@implementation ClassA 
- (int) addNumber:(int)num1 withNumber:(int)num2 { 
    return num1 + num2; 
} 

+ (int) add:(int)num1 with:(int)num2 { 
    return num1 + num2; 
} 
@end 

Sau đó, bạn có thể làm:

#import "ClassA.h" 

@interface ClassB : NSObject { 
    ClassA* adder; 
} 

//constructors 
- (id) init; //creates a new instance of ClassA to use 
- (id) initWithAdder:(ClassA*)theAdder; //uses the provided instance of ClassA 

//instance methods 
- (int) add2To:(int)num; 

//static/class methods 
+ (int) add3To:(int)num; 
@end 

@implementation ClassB 
- (id) init { 
    if (self = [super init]) { 
     adder = [[ClassA alloc] init]; 
    } 
    return self; 
} 

- (id) initWithAdder:(ClassA*)theAdder { 
    if (self = [super init]) { 
     adder = theAdder; 
    } 
    return self; 
} 

- (int) add2To:(int)num { 
    return [adder addNumber:2 withNumber:num]; 
} 

+ (int) add3To:(int)num { 
    return [ClassA add:3 with:num]; 
} 
@end 

Lưu ý rằng trong hầu hết các trường hợp, bạn sẽ sử dụng phương pháp dụ chứ không phải là phương pháp tĩnh.

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