2011-01-06 143 views
0

我有一個帶有4個選項卡的選項卡欄控制器。每個選項卡都有自己的視圖控制器和一個UIWebView。在另一個視圖控制器中訪問實例方法

比方說,我有一個VC1按鈕(按鈕1)和一個實例方法onClick1爲好。在vc2中我有一個名爲reload的方法。我的問題是,如何從vc1訪問vc2中的特定實例方法onClick1?

對於進一步的細節,實際上,我試圖代碼爲iPhone一個簡單的購物工具。當用戶從瀏覽視圖中將商品添加到購物車時,我希望能夠自動重新加載購物車視圖。

下面是我的意思的一些例子。這個問題比我想象的要困難得多。我不確定我是否重新設計了我的應用程序或什麼。也許有兩個vc1和vc2屬於vcmain的子類,並參考它們中的每一個?但是,如果我這樣做,那麼我該如何將它們引用到它們相應的.xib中?多謝你們!

@implementation viewController 1 

//Reloads vc2 
-(IBAction) onClick1: (id) sender { 

//Calls vc2 reload 
[vc2 reload]; 
} 

@end 

@implementation viewController 2 

//Reload View 
-(void)reload { 
    [webView reload]; 
} 

@end 

回答

0

我想你應該已經有類似的基UIViewController(姑且稱之爲MyTabBars)具有包含所有標籤欄視圖控制器一個UITabBarController *tabBarController。如果聽起來很熟悉,您需要一個名爲-(void)reloadCart的方法MyTabBarsreloadCart將步行tabBarController.viewControllers陣列。在每個viewController上,您可以執行respondsToSelector:@selector(reload),如果具體的viewController合格,則它會調用該選擇器方法。

爲了做到這一點,你可能希望所有的VC1,VC2,...文件有一個id delegate定義和合成。當MyTabBars創建不同的標籤欄時,它將vc1和vc2設置爲self

@implementation MyTabBars 

//Reload Cart View 
-(void)reloadCart { 
    for (UIViewController *thisUIViewController in tabBarController.viewControllers){ 
    if ([thisUIViewController respondsToSelector:@selector(reload)]) { 
     [thisUIViewController reload]; 
    } 
    } 
} 

@end 

假設你懂得繞道的MyTabBars委託到您的VC1和VC2,那麼你現在可以在VC1以下代碼:

@implementation viewController1 

//Reloads vc2 
-(IBAction) onClick1: (id) sender { 

//Calls MyTabBars reloadCart which will look for all tab bar view controllers 
//that have the 'reload' method 
[delegate reloadCart]; 
} 

@end 

該解決方案的想法會導致MyTabBars觸發任何reload方法在我們的任何標籤欄視圖控制器中找到。因此,請注意在vc1,vc2等文件中命名這種方法。這個解決方案將根據您的命名約定使用相同的方法觸發唯一的vc方法或多個vcs。

希望這會有所幫助。

1

你基本上有三種方法,其中每一個都有加分和短處。我將給你一個高層次的概述,並讓你轉到Apple非常全面的文檔以獲取詳細信息。希望我可以給你正確的條款谷歌更具體的幫助。

@dredful相當巧妙的細節是有辦法處理「其他」視圖控制器和直接調用方法。這很好,但它可能會讓人困惑和麻煩,將指針指向所有的控制器,並遍歷視圖層次結構以獲取想要的控制器確實非常棘手。

第二種方法是鍵 - 值觀察。您可以註冊一個視圖控制器來「觀察」另一個視圖控制器的特定鍵(命名屬性),並在發生各種事情時觸發特定的選擇器。雖然在某些時候你必須同時指向兩個控制器,但這並不能完全緩解上述「直接調用它」方法的缺點,這有點神奇而且很好。這也是視圖控制和數據的一種不幸偶合,MVC的中斷類型。

第三種方法是使用NSNotificationCenter的。一個類可以發佈通知,並且任何其他註冊自己的對象都可以在發生這種情況時觸發該通知。這很好,因爲你可能有很多不同的對象將物品添加到購物車,並且他們可以僅僅向通知中心發送一張紙條(即使將物品或任意數據傳遞給它),並且購物車視圖可以使用這些通知,抓住通過的物體,做它的事情,而不是關心特別是誰在跟它說話。它使應用程序的各個部分保持良好的分離。缺點是,它有一些開銷,並且無論選擇通知的消耗類是否同步執行,都無法隱藏網絡活動或其他一些長時間過程。

相關問題