2009-10-24 82 views
0

在我的iPhone應用程序中,我有多個類文件,我有我的主應用程序的類文件,然後我有我的UIView類文件。我有一個簡單的 - (void)方法在我的UIView類文件中聲明,我怎樣才能從我的主要應用程序類文件中訪問它?iPhone SDK:訪問其他類中的方法

更詳細一點:在我的應用程序中播放視頻,當這個視頻播放完畢後,會發送一個通知並執行操作,但我已經成功設置了該操作,但是當電影結束時,我想聲明一個方法在另一個類文件中被執行。如果方法是在同一個類文件中聲明的,我會簡單地使用下面的代碼:[self mySimpleVoidMethod];但是,顯然這不起作用如果方法在不同的類文件中聲明。我相信有可能訪問一個在不同類文件中聲明的方法,但是我只是不知道如何去做。對不起,如果我使用完全不正確的術語來命名事物。但我對所有的編程都比較陌生。

回答

3

根據您的設置,您有幾個選項。這裏有幾個:

1)添加到類的引用與功能(被叫方)在調用者的類屬性:

Caller.h

@interface Caller : SomeObject { 
    Callee *myCallee; 
    ... 
} 
@property(nonatomic, retain) Callee *myCallee; 

Caller.m

@synthesize myCallee; 
-(void)someAction { 
    [myCallee doSomething]; 
} 

東西都初始化放學後設置來電:

caller.myCallee = callee; 

2)使用另一個通知事件,就像它看起來你已經知道該怎麼做。

3)使用的協議,如果你有一堆不同的類中的主叫方可能需要調用所有支持相同的方法:

DoesSomething.h

@protocol DoesSomething 
    -(void)doSomething; 
@end 

Callee.h

@interface Callee : NSObject<DoesSomething> { // NSObject or whatever you're using... 
    ... 
} 
-(void)doSomething; 

Caller.h

@interface Caller : SomeObject { 
    id<DoesSomething> *myCallee; 
    ... 
} 
@property(nonatomic, retain) id<DoesSomething> *myCallee; 

...然後根據示例1.

4)使用performSelector向類發送消息。

來電者。^ h

@interface Caller : NSObject { 
    SEL action; 
    id callee; 
} 
-(void)setupCallbackFor:(id)target action:(SEL)callback; 

Caller.m

-(void)setupCallbackFor:(id)target action:(SEL)callback { 
    callee = target; 
    action = callback; 
} 

-(void)someAction { 
    if([callee respondsToSelector:action]) { 
     [callee performSelector:action]; 
} 

我敢肯定還有其他的方法,有優點和缺點,每一種,但東西應該有適合您的需要和/或放棄你足以掃描文檔,以填補任何空白...

+0

嗯,進出口仍然有點混亂,說如果我有一對類,second.h和second.m,並在這些宣告是一種方法是,可以說集的圖像視圖的α位零,你能否在其他類文件中使用該方法顯示第一組類文件(first.h + first.m)的具體示例。這將有助於讓我更清楚。無論如何感謝至今。 – Sam

+0

這取決於你的場景,但正如你描述的類,那麼上面的每個場景的第一個將是來電者,第二個將是被調用者(抱歉,類名稱選擇不好 - 我的意思是被調用者?真的嗎?Yeesh。 ..)有時它可以幫助我複製並粘貼到編輯器中,然後搜索/替換,直到它有意義。 – jasondoucette

+0

好吧,我現在可以更多地瞭解你的例子。我嘗試了你的第一個建議,通過在函數中添加一個對該類的引用,作爲調用者類中的一個屬性,但是它引用了那些對我來說沒有工作的類,使用你的代碼,(但將「SomeObject」更改爲「 UIView「)在'Callee'之前,我得到一個錯誤x2」期望說明符 - 限定符列表「,這讓我想知道是否被調用* myCallee;是引用一個類的正確方法。 – Sam

0

您將需要其他類的實例,可以從影片完成時運行的代碼訪問。通常,這是通過將另一個類的實例作爲字段存儲在類中來完成的,可以通過「setter」進行設置,也可以在構建期間進行設置。您還可以使用key-value observing,觀看代表電影播放狀態的鍵;另一個類的實例可以註冊以觀察對該鍵的更改。

特別是對於使用UIView的模式,視圖的UIViewController將有權訪問它(通過view方法)。如果你的「主應用程序的類文件」有一個指向控制器的指針 - 他們可能會這樣做,通過Interface Builder進行設置 - 那麼這是一個到UIView實例的簡單方法。

1

我幾周前做了一篇博客文章,概述了一種方法來做到這一點。它與以前的答案類似,幷包含一些示例代碼,您可以下載並查看。它基於使用表格視圖控制器,但您應該能夠在不太困難的情況下將想法適應於您的應用程序。

Passing values and messages between views on iPhone