从应用程序委托向viewController发送消息

时间:2009-12-07 17:07:30

标签: iphone navigationcontroller

我是obj C的新手,我来自AS3.0背景。 基本上在我正在制作的这个应用程序中,我正在使用应用程序委托中的applicationWillResignActive来响应来电。我有一个带有表视图的navigationController,它只触发select上的另一个视图(基本上是xcode中提供的模板) 我的AnotherViewController视图中有一个方法从行select中加载。该方法(现在)将我的标签更改为“Call in in”。 在我的applicationWillResignActive我正在调用这个方法,它工作正常,但我得到一个恼人的警告说UIViewController可能无法响应handleIncomingCall ...但它编译很好,并且DOES响应它。我怎样才能摆脱这个警告标志?

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

对不起,我正试图弄清楚如何在这里格式化它......

5 个答案:

答案 0 :(得分:0)

原因是因为你告诉编译器对象是UIViewController而handleIncomingCall确实不是UIViewController的方法。你可以摆脱我的警告,包括.h文件,并将对象定义为AnotherViewController或任何你最后调用它。委托将在.h文件中看到handleIncomingCall是该类的方法,因此将停止向您发出该警告。

Obj-C不是一种强类型语言,这就是它编译的原因。它的工作原理是因为虽然您将变量定义为UIViewController,但它实际上是您自己的类型,它响应相应的消息。但是编译器无法在编译时知道这一点。

答案 1 :(得分:0)

好的,所以我这样做:

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

这对于这个应用程序非常有用,我只是想知道如果有多个视图使用该方法并且你想调用它,你将如何处理它。我不认为你会在if语句中添加一堆||。当我到达那里时,我会越过那座桥。非常感谢你的帮助!!

答案 2 :(得分:0)

  1. 您可以子类化为每个vc提供您喜欢的任何方法,并使用公共类调用它们,消息将被传递下去。

  2. 最简单的解决方案是NSNotificationCenter example。经过测试和工作。

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

  4. 在appDelegate中创建handleVC1,handleVC2等方法。

    在应该响应的每个viewcontroller中的viewWillAppear上,在appDelegate中设置一个对象visibleID(任何类型)。

    在applicationWillResignActive中,使用ID调用适当的方法。他们可能是

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

    但是如果不需要在每个viewcontroller中完成那个处理,handleVC1,handleVC2等可以完全在appDelegate中编写代码,并且仍然可以“适应”一些。

    我通常是@class vc1(等等)...... IBOutlet ...无论如何都要在mainwindow.xib中添加和连接。这样我为每个viewcontroller都有一个初始化对象,如果需要,我可以随心所欲地做任何事情。标准程序:)

    我认为其中一个应该能帮到你。

答案 3 :(得分:0)

我通过这样做完成了它。

在app委托中,我为视图控制器创建了一个属性

#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;

然后我可以轻松地从app delegate向viewController发送消息。

如果此答案存在任何遗传问题,请与我们联系。它对我有用......

答案 4 :(得分:0)

我知道这是一个老问题,但这似乎对我有用。

在AppDelegate.m中:

#import "ViewController.h"

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

然后实现 - (void)测试;在ViewController中(不要忘记将它添加到ViewController.h中)

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

这只是一个如何向视图控制器发送消息的简单示例,您可以从那里将消息发送到其他UIViewController实例。

相关问题