Dưới đây là các lớp học Objective-C của tôi:Chức năng gọi mục tiêu-C trên một lớp khác?
AppDelegate
SomeScript
Làm thế nào tôi có thể gọi hàm LOGGEDIN trên lớp SomeScript từ app-đại biểu hoặc bất kỳ lớp khác?
Cảm ơn, Christian Stewart
Dưới đây là các lớp học Objective-C của tôi:Chức năng gọi mục tiêu-C trên một lớp khác?
AppDelegate
SomeScript
Làm thế nào tôi có thể gọi hàm LOGGEDIN trên lớp SomeScript từ app-đại biểu hoặc bất kỳ lớp khác?
Cảm ơn, Christian Stewart
(Tôi sẽ giả loggedIn
là một phương pháp dụ dùng không có thông số.) Thứ nhất, một số vấn đề ngữ:
Vì vậy, kế hoạch mới của chúng tôi là trước tiên, hãy khởi tạo SomeScript, sau đó gửi tin nhắn đến ví dụ.
SomeScript* myScript = [[SomeScript alloc] init]; //First, we create an instance of SomeScript
[myScript loggedIn]; //Next, we send the loggedIn message to our new instance
Điều này là tốt. Tuy nhiên! Tôi đặt cược bạn muốn kịch bản của bạn để dính xung quanh để sử dụng sau này. Vì vậy, chúng ta nên thực sự biến nó thành một biến thể hiện của ủy nhiệm ứng dụng của bạn. Vì vậy, thay vào đó, trong AppDelegate.h, thêm này bên trong dấu ngoặc:
SomeScript* myScript;
Bây giờ biến của chúng tôi sẽ dính vào xung quanh, và dòng đầu tiên của chúng tôi từ trước khi trở thành đơn giản:
myScript = [[SomeScript alloc] init];
biến chứng cuối: chúng tôi không muốn để tạo ra một mới mỗi lần chúng tôi gọi loggedIn
(tôi giả định)! Vì vậy, bạn nên đặt instantiation ở đâu đó nó sẽ chỉ được chạy một lần (ví dụ, application:DidFinishLaunchingWithOptions:
). Ta-da!
Bạn phải có một tài liệu tham khảo khởi tạo của một đối tượng SomeScript trong lớp appdelegate của bạn (giả bạn không cần SomeScript là một lớp Singleton như appdelegate của bạn). Một cái gì đó như:
SomeScript * myScript;
như một Ivar trong giao diện appdelegate của bạn, trong khi ở nó application:DidFinishLaunchingWithOptions:
bạn đã inited nó (giả sử với cách gọi alloc default/init kết hợp):
myScript = [[SomeScript alloc] init]
Xong tất cả điều này, khi bạn cần gọi một phương thức của myScript, bạn chỉ cần thực hiện:
[myScript myMethod:myParameter]
Here bạn có thể tìm thấy một hướng dẫn tốt đẹp cho người mới bắt đầu từ Apple
Nếu bạn không muốn sử dụng các phiên bản của SomeScript ... bạn có thể làm theo một cách tiếp cận khác. Sử dụng NSNotificationCenter để gửi một thông báo đến đối tượng SomeScript của bạn và làm cho nó chạy một bộ chọn sau đó.
Trong bạn - Phương pháp (void) awakeFromNib {}, từ SomeScript đặt đoạn mã sau:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mySelector:)
name:@"aUniqueNameForTheNotification"
object:nil];
Tạo phương pháp "mySelector:" và đặt các cuộc gọi đến phương pháp LOGGEDIN của bạn. (Hoặc nếu bạn thích, bạn có thể thay thế "mySelector:" với LOGGEDIN trực tiếp)
-(void) mySelector:(id)elem
{
[self loggedIn];
}
Sau đó, đừng quên để loại bỏ các quan sát viên trên dealloc, vì vậy đặt đoạn mã sau đây trong lớp SomeScript của bạn cũng:
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
Sau đó, bạn có thể gửi một thông báo từ bất kỳ khác như vậy:
[[NSNotificationCenter defaultCenter] postNotificationName:@"aUniqueNameForTheNotification" object:self];
Đó mảnh cuối cùng của mã sẽ gửi một thông báo đến SomeScript và chọn của bạn được thực thi.
Hy vọng nó sẽ giúp các bạn!
Chúng ta có thể gọi nó như [self loggedIn]
Khi LOGGEDIN phương pháp là trong SomeScript lớp, sử dụng cú pháp đơn giản trong xcode mới nhất.
[[SomeScript new] loggedIn];
Điều này có yêu cầu deallocating sau đó không? Tôi giả sử không có cách nào để .. – durazno
với ARC không có yêu cầu deallocation. –
Bạn cần thêm gì đó vào việc phát hành myScript – JeremyP
@JeremyP: Đó là trong AppDelegate của mình. @ChristianStewart: Quyền của Jeremy, bạn thường nên gửi 'release' sang' myScript' khi bạn đã hoàn thành nó. Tôi đã không nói với bạn bởi vì tôi cho rằng bạn sẽ sử dụng nó trong suốt thời gian ứng dụng của bạn mở. – andyvn22
Nó không gây hại gì để có thói quen tốt. Về mặt kỹ thuật, bạn không cần phải giải phóng mọi thứ mà đại biểu ứng dụng của bạn nắm giữ vì ứng dụng ủy nhiệm chính nó vẫn tồn tại cho đến khi kết thúc. Tuy nhiên, đó là một ý tưởng tốt để có được thói quen đưa bản phát hành vào -dealloc. Nó cần phải trở thành tự động. – JeremyP