我是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];
}
对不起,我正试图弄清楚如何在这里格式化它......
答案 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)
您可以子类化为每个vc提供您喜欢的任何方法,并使用公共类调用它们,消息将被传递下去。
最简单的解决方案是NSNotificationCenter
example。经过测试和工作。
我需要做一些其他的事情,所以我做的不同。
在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实例。