2009-12-07 102 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实例。

相关问题