2009-07-08 198 views
5

總之,怎麼樣?調用實例方法的實例方法調用實例方法

我有一個視圖控制器,創建一些自定義對象。其中一個對象需要在控制器中調用一個方法。該對象看起來像它想要在控制器中調用一個類方法,這可能很好,除非控制器中的類需要調用控制器中的實例方法,而且似乎不想這樣做。那有意義嗎?

如果不是,這裏是僞代碼:


ViewController.m 

#import "customObj.h" 
-(void)viewDidLoad{ 
    [email protected]"string";//declared in ViewController.h 
} 
-(void)createObj{ 
    [email protected]"different string"; 
    customObj *customObjInstance=[[customObj alloc] init]; 
} 

--- 

customObj.m 

#import "ViewController.h" 
-(void)callBack{ 
    [ViewController createObj]; 
} 

好了,所以回調運行時,它的錯誤,說這是找+ CREATEOBJ(不-createObj)。我可以將createObj更改爲一個類方法,但是它有一個設置foobar的問題,因爲foobar是在-viewDidLoad中初始化的,我無法將其更改爲+ viewDidLoad。我可以將foobar移動到一個類的方法中,但是我怎麼稱呼它呢?取而代之的是,我是指[ViewController ...]?我不認爲這是有效的。

我的猜測是我錯過了一些基本的概念,它並不像我做的那樣困難。我非常感激任何能夠讓我擺脫困境的人。

非常感謝。

回答

5

沒有單一的正確答案;這取決於您的自定義對象如何與控制器交互。大多數UIKit視圖使用「目標動作」模式與控制器進行通信,而大量模型對象使用委託模式。您使用哪一個取決於您的控制器和您的自定義對象的具體情況。

然而,機械地,你可能會需要做的是傳中的一個指針ViewController當你通過自定義初始創建customObj,像這樣:

customObj *customObjInstance = [[customObj alloc] initWithController: self]; 

一定是有道理的如果你這樣做,你的customObj將與你的控制器緊密耦合。

+0

嗯...謝謝。過去我已經通過了指針,看起來像這樣的一個聲音,我無法想象這是做到這一點的正確方法。 因此,一個對象沒有引用創建它的對象?我曾經使用的其他語言具有與父對象的超類不同的「父」。如果我有一個創建一個uitableview對象的uiview對象,那麼這個tableview對象沒有任何對它產生的uiview實例的引用?這個遺漏是我不斷遇到的。 再次感謝。 – 2009-07-08 03:50:49

+0

視圖具有「superview」的概念,這是它們所包含的視圖 - 但沒有「創建對象」的一般概念。通常,您決定控制器對象與模型對象有什麼關係。舉例來說,你可能會認爲一個customObj實例需要另一個對象來爲它創建更多的對象,並且你可以使用一個委託來建模(這是一個指向另一個對象的指針,但更多通用)。 有很多種方法可以做到,最好的方法取決於你的具體情況。 – 2009-07-08 03:56:31

3

您可能已經向我拋出了各種提及類的實例,但如果您的意思是控制器需要創建可以調用控制器的對象(創建更多相同的對象),那我可以幫助你。

我這個做了不少,使用 - 約翰已經提到 - 的委託模式:

定義的協議從對象到控制器的呼叫: 回調

// CallBackDelegate.h 


#import <Foundation/Foundation.h> 

@protocol CallBackDelegate<NSObject> 
- (void)callBack; 
@end 

在用於控制器我導入協議

#import "CallBackDelegate.h" 

並指定頭文件,所述控制器實現此協議:

@interface MyViewController : UIViewController <CallBackDelegate> 
{ ... 

同時在自定義對象類的頭也導入協議

#import "CallBackDelegate.h" 

,並添加其符合協議實例成員:

id<CallBackDelegate> delegate; 

和一個屬性,它必須是分配不保留或您將擁有循環保留,控制器和自定義對象將保留對方,這將意味着他們永遠不會釋放

@property(assign) id<CallBackDelegate> delegate; 

(該部件不具有被稱爲委託)

然後確保當你的視圖控制器創建自定義對象將其設置它自身作爲委託

customObject.delegate = self; 

然後在您的自定義對象,你可以安全地做到這一點:

[ delegate callBack]; 

希望幫助, 墊

如果你搜索蘋果示例代碼,你會發現類似的例子:

[delegate touchesEnded:touches withEvent:event];

當然

如果你想方法將一個ID傳遞您所創建的對象,如果你願意,你可以寫一個init方法,該方法不需要返回(無效)在我的例子

以約翰也建議的代表

customObj * customObjInstance = [[customObj alloc] initWithController:self];

裏面的initWithController你傳入的控制器需要分配爲代理