2009-11-01 32 views
19

Đã tìm câu trả lời cho câu hỏi này, nhưng tôi chưa tìm thấy câu trả lời phù hợp. Tôi hy vọng các bạn (và các cô gái) có thể giúp tôi! (Đây là ứng dụng dành cho iPhone)Truy cập Phương thức từ các Lớp khác Mục tiêu-C

Được rồi, tôi có ứng dụng Mutliview. Mỗi chế độ xem đều có lớp riêng và mọi thứ đều vui. Tuy nhiên, các lớp khác nhau đôi khi gọi cùng một phương thức. Cho đến bây giờ, tôi đã viết một cách đơn giản Phương thức đó hai lần, trong cả hai tệp lớp.

Đây là những gì tôi muốn làm mặc dù:

Tôi muốn thực hiện một lớp mới, trong tập tin riêng của nó, có tất cả các phương pháp "chung". Sau đó, bất cứ khi nào một lớp khác cần gọi Phương thức, tôi chỉ đơn giản gọi nó từ tệp khác. Bằng cách này, khi tôi muốn thay đổi Phương pháp, tôi chỉ cần thay đổi nó ở một nơi và không phải tất cả các địa điểm ...

Tôi không chắc chắn cách tôi làm điều này, đó là lý do tại sao tôi ' m yêu cầu giúp đỡ. Tôi là một chút gỉ và mới cho Objective-C, vì vậy các ví dụ đẹp sẽ giúp tôi rất nhiều. Cho phép tôi cung cấp cho bạn một.

File: ViewController1.m

@implementation ViewController1 

//Do Some awesome stuff.... 

CALL "CommonMethod" HERE 

@end 

File: ViewController2.m

@implementation ViewController2 

//Do Some awesome stuff.... 

CALL "CommonMethod" HERE 

@end 

File: CommonClass

@implementation commonClass 

- (void)CommonMethod:(id)sender 
{ 

//So some awesome generic stuff... 



    } 
@end 

tôi cảm thấy như tôi cần phải #import các tập tin khác, tạo một Object từ lớp và gọi phương thức từ Object ... Làm thế nào để làm điều đó?

Cảm ơn bạn lần nữa!

Trả lời

26

Lựa chọn 1:

@implementation commonClass 
+ (void)CommonMethod:(id)sender /* note the + sign */ 
{ 
//So some awesome generic stuff... 
    } 
@end 

@implementation ViewController2 

- (void)do_something... { 
    [commonClass CommonMethod]; 
} 


@end 

Phương án 2:

@implementation commonClass 
- (void)CommonMethod:(id)sender 
{ 
//So some awesome generic stuff... 
    } 
@end 

@implementation ViewController2 

- (void)do_something... { 
    commonClass *c=[[commonClass alloc] init]; 
    [c CommonMethod]; 
    [c release]; 
} 

@end 

Lựa chọn 3: Sử dụng thừa kế (xem mô tả của ông Totland trong chủ đề này)

@implementation commonClass 
- (void)CommonMethod:(id)sender 
{ 
//So some awesome generic stuff... 
    } 
@end 

/* in your .h file */ 
@interface ViewController2: commonClass 

@end 

tự nhiên bạn luôn cần đến #import commonClass.h trong bộ điều khiển chế độ xem của bạn ..

+0

Xin chào, lớp siêu phổ biến của CommonClass ở đây là gì? Tôi có nghĩa là tôi có một phương pháp mà tôi cần phải gọi từ nhiều lớp khác nhau, vì vậy những gì sẽ là thực hành tốt nhất cho nó? –

+0

Được phép '[phát hành sản phẩm] 'ở chế độ ARC? Trình biên dịch cho tôi biết nó không được phép. – tymac

+0

@tymac Bài đăng này là từ năm 2009, trước ARC. –

3

Nghe có vẻ như tôi, mã phổ biến không nhất thiết phải ở trong một lớp học. Có lý do gì mà bạn không thể sử dụng chức năng kiểu C cho những gì bạn muốn làm không?

Bạn có thể đặt mã chung vào một lớp và sau đó tạo hai lớp con khác của lớp đó; phương pháp này cũng tránh trùng lặp mã.

Một tùy chọn khác có thể là viết phương thức lớp thay vì các phương pháp mẫu cho mã chung này. Tôi nghĩ hầu hết mọi người đều cảm thấy rằng những người độc thân được tránh là một lựa chọn thiết kế tốt nhất.

Sẽ dễ dàng hơn nếu đưa ra câu trả lời hay nếu chúng tôi biết nhiều hơn về những gì bạn thực sự đang cố gắng hoàn thành.

+0

Có vẻ như đó là vấn đề không tận dụng thừa kế. –

+0

Cảm ơn bạn. Tôi đã có một phương pháp (method1) trong Class1. Tôi đã tuyên bố nó trong Class1.h và được thực hiện trong Class1.m. Tôi có Class2 và nó có một bộ chọn: @selector (method1). Trong trường hợp này làm thế nào tôi có thể làm điều đó? –

+1

@Williham, đó là những gì nó giống như âm thanh. @srikanth, có thể bạn cần phải đặt một câu hỏi thay vì chỉ đăng một bình luận ở đây? –

3

gì bạn muốn làm là làm cho hai bộ điều khiển chia sẻ một lớp cha chung:

UIViewController : MyAwesomeViewController : ViewController1 
              : ViewController2 

commonMethod: sau đó sẽ nằm trong MyAwesomeViewController. Ngoài ra, không bắt đầu tên phương thức với chữ in hoa. :)

Xây dựng:

[email protected] MyAwesomeController : UIViewController { 

[email protected] ViewController1 : UIViewController { // and ditto for ViewController2 
[email protected] ViewController1 : MyAwesomeController { 
+0

+1 thừa kế là con đường để đi. –

1

Gấu nhớ rằng Objective-C chỉ là một superset của C, và rằng trong khi chỉ thị #include chủ yếu sử dụng cho các tập tin tiêu đề, không có gì ngăn cản bạn sử dụng một # là bao gồm nhúng nội dung của một triển khai bên trong triển khai khác. Nếu mã thực sự giống hệt nhau, bạn có thể dễ dàng chỉ dán nó vào tệp riêng của nó và #include nó trong tệp .m.

Có nói rằng, có lẽ sẽ tốt hơn khi sử dụng kỹ thuật này cùng với các danh mục, đặc biệt nếu cùng một thực hiện có hành vi tương tự.

1

đèo trong một tham chiếu đến commonClass của bạn khi bạn alloc và init quan điểm của bạn ...

CommonClass *cc = [[CommonClass alloc] init]; 

ViewController1 *vc1 = [[ViewController1 alloc] ... initWith:cc]; 
ViewController2 *vc2 = [[ViewController2 alloc] ... initWith:cc]; 

nhưng thực hiện một c cổ điển bao gồm có thể đủ.

6

Có một số câu trả lời ở đây yêu cầu bạn tạo một lớp "cha mẹ" chung. Tuy nhiên tôi nghĩ rằng bạn có thể làm tốt hơn rất nhiều. Thay vào đó, hãy tạo một category cho UIViewController. Bạn không biết tất cả các bên trong của những gì đang xảy ra với UIViewController vì vậy tôi không nghĩ rằng nó là giá trị tạo ra hệ thống phân cấp View Controller của riêng bạn tắt của. Trong thực tế nó có thể nguy hiểm. Tôi chạy vào một số vấn đề khi tôi cố gắng tạo ra một "cơ sở" UITableViewController và sau đó tạo ra các lớp học kế thừa từ đó. Tôi đã tránh những vấn đề này bằng cách sử dụng các danh mục thay thế.

Ưu tiên số 1 của bạn không được kế thừa mọi thứ mà không có lý do chính đáng, cần tải ứng dụng vào cửa hàng ứng dụng mà mọi người sẽ muốn tải xuống.

+0

+1 cho đoạn cuối cùng ... –

0

Là một người dùng iPhone với nền Java và C nhỏ, tôi có một vấn đề tương tự muốn tham khảo một phương thức trong cả RootController và ViewController. Dường như với tôi rằng nơi thích hợp cho phương pháp này là tầng lớp appdelegate, một thể hiện của cái nào có được trong các lớp học khác bằng cách:

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 

sau đó nếu phương pháp này là "doSomething" một truy cập nó bằng cách:

[delegate doSomething]; 

Nhưng có lẽ điều này quá rõ ràng hoặc không phải những gì được yêu cầu.

0

Một phương pháp mà bạn có thể sử dụng

@interface ServerManager : NSObject 

+(ServerManager *)getInstance; 

@implementation ServerManager 

+(ServerManager *)getInstance 
{ 
static ServerManager *objServerManager = nil; 

if(objServerManager==NULL){ 
objServerManager=[[self alloc] init]; 
} 
// Return the servermanager object. 
return objServerManager; 
} 

Gọi Cho dù bạn muốn sử dụng

ServerManager *SMObject = [ServerManager getInstance]; 

Đừng quên để nhập tập tin servermanager.h.

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