1

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

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

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

4

5 回答 5

0

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

Obj-C 不是强类型语言,这就是它编译的原因。它之所以有效,是因为尽管您将变量定义为 UIViewController,但它实际上是您自己的类型,可以响应适当的消息。但是编译器无法在编译时知道这一点。

于 2009-12-08T17:25:37.570 回答
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 发送消息。

如果这个答案有任何继承问题,请告诉我。这个对我有用...

于 2011-06-29T13:40:56.487 回答
0

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

在 AppDelegate.m 中:

#import "ViewController.h"

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

然后执行 - (void)test;在 ViewController 中(不要忘记将其添加到 ViewController.h 中)

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

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

于 2014-10-16T11:06:59.803 回答
0

好的,所以我正在这样做:

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

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

于 2009-12-08T18:10:22.040 回答
0
  1. 您可以子类化为每个 vc 提供您喜欢的任何方法并使用公共类调用它们,消息将被向下传递。

  2. 最快的解决方案是这个简单的NSNotificationCenter 例子。测试和工作。

  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 反正。这样我每个视图控制器都有 1 个初始化对象,然后如果需要,我可以对它们做任何我想做的事情。标准程序 :)

我认为其中之一应该可以解决您的问题。

于 2011-05-31T09:09:18.983 回答