2009-12-07 44 views
1

我是新來obj C,我來自AS3.0背景。 基本上,在這個應用程序中,我正在使用應用程序委託中的applicationWillResignActive來響應來電。我有一個導航控制器與表視圖,只是觸發選擇另一個視圖(模板提供的Xcode基本上) 我在我的AnotherViewController視圖中有一個方法從行選擇加載。該方法將(現在)改變我的標籤在那裏「呼叫進來」。 在我的applicationWillResignActive我打電話這個方法,它工作正常,但我得到一個惱人的警告,說UIViewController可能無法響應handleIncomingCall ...但它編譯罰款和答覆。我怎樣才能擺脫這個警告標誌?從應用程序代理髮送消息給viewController

-(void) applicationWillResignActive:(UIApplication *)application { 
    NSLog(@"CALL COMIN IN"); 
    UIViewController *vc = [navigationController visibleViewController]; 
    [vc handleIncomingCall]; 
    [vc release]; 
} 

對不起,我想弄清楚如何將它在這裏...格式

回答

0

的原因是因爲你告訴編譯器對象是的UIViewController和handleIncomingCall的確是一個不UIViewController的方法。你可以擺脫包括.h文件在內的警告,並將對象定義爲AnotherViewController或任何你調用它的東西。代理將在.h文件中看到handleIncomingCall是該類的一個方法,因此將停止向您提供該警告。

Obj-C不是強類型語言,這就是它編譯的原因。它的工作原理是因爲儘管將變量定義爲UIViewController,但它實際上是您自己的類型,它會響應相應的消息。但編譯器無法在編譯時知道這一點。

+0

嘿, 感謝您的回覆。這是關於我得到的地方。我發現它確實試圖在UIViewController上調用我的方法,所以我將它轉換爲AnotherViewController。問題是在此事件期間可能會看到任何數量的視圖控制器,而不僅僅是AnotherViewController。任何關於如何寫出來的建議?任何方式來檢查目前可見的類型,並採取相應的行動? – bmanderscheid 2009-12-08 17:36:45

0

OK,所以我這樣做:

AnotherViewController *vc = (AnotherViewController *) navigationController.visibleViewController; 
    if ([vc isKindOfClass:[AnotherViewController class]]){ 
     [vc handleIncomingCall]; 
    } 
    else{ 
     NSLog(@"NOT ANOTHER VIEW CONTROLLER DO NOTHING"); 
    } 

這將工作爲這個偉大的應用程序,我只是想知道你將如何處理它,如果有與該方法多的觀點和你想叫它。我不認爲你會爲if語句添加一堆||。當我到達那裏時我會穿過那座橋。謝謝你的幫助!

0
  1. 您可以通過子類來爲每個vc賦予您喜歡的任何方法並使用公共類調用它們,消息將傳遞到下方。

  2. 最快的解決方案就是這個簡單的NSNotificationCenterexample。經過測試和工作。

  3. 我需要做一些其他的東西,所以我做了不同的事情。

在appDelegate中創建handleVC1,handleVC2等方法。

在viewWillAppear中應該響應的每個視圖控制器中,在appDelegate中設置一個對象visibleID(任何類型)。

在applicationWillResignActive中,使用ID調用適當的方法。他們可能是

-(void)handleVC1 {[vc1 handleIncomingCall];} 

-(void)handleVC2 {[vc2 handleIncomingCall];} 

但如果處理不需要從每個視圖控制器內完成,handleVC1,handleVC2等可以寫它的代碼中的appDelegate完全和仍然可以「適應」有點。

我通常@class vc1(etc)... IBOutlet ...無論如何添加和連接mainwindow.xib。這樣我就爲每個viewcontroller初始化了一個對象,然後如果需要的話,我可以隨心所欲地做任何事情。標準程序:)

其中一個應該解決你的問題,我想。

0

我通過這樣做完成了它。

在應用程序委託我,我想收到我這樣做消息的視圖控制器做了一個屬性視圖控制器

#import <UIKit/UIKit.h> 
#import "MyViewController.h" 

@interface AppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> { 

    UIViewController *myViewController; 


} 

@property (nonatomic, assign) UIViewController *myViewController; 


@end 

然後。

AppDelegate *theAppDelegate = (AppDelegate*) [UIApplication sharedApplication].delegate; 

theAppDelegate.myViewController = self; 

然後,我可以很容易地從應用程序委託向viewController發送消息。

請讓我知道這個答案是否有任何繼承問題。它適用於我...

0

我知道這是一個老問題,但這似乎爲我工作。

在AppDelegate.m:

#import "ViewController.h" 

- (void)applicationWillResignActive:(UIApplication *)application { 
    ViewController *viewController = (ViewController *)self.window.rootViewController; 
    [viewController test]; // Implement this in ViewController 
} 

,然後實現 - (無效)測試;在視圖控制器(不要忘了將它添加到ViewController.h太)

- (void)test 
{ 
    NSLog(@"Test Successful"); // If all goes well, this will be printed when app resigns being active 
} 

這是如何的消息發送到視圖控制器,從那裏你可以進一步將消息發送到對方只是一個簡單的例子UIViewController實例。

相關問題