Xcode:视图控制器和App Delegate之间的连接

Pon*_*otg 8 iphone xcode cocoa-touch objective-c ipad

这可能是一个noob问题,但无法理解它.

如何在2个viewcontrollers或视图控制器和我的appdelegate之间建立连接?我通常做的是将以下内容添加到我的app委托"h"文件中

@class RootViewController;


@interface TabBarWithSplitViewAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {
    RootViewController *rootViewController;



}
@property (nonatomic, retain) IBOutlet RootViewController *rootViewController;

@end
Run Code Online (Sandbox Code Playgroud)

然后在Interface Builder中创建一个连接.从我的根视图控制器到应用程序委托,并自动告诉我这是我上面添加的rootViewController.

如果你在app委托"m"文件上执行此操作:

#import "RootViewController.h"

NSLOG(@"Controller %@",rootViewController);
Run Code Online (Sandbox Code Playgroud)

它会给你一堆数字,表明有连接

但正如您所知,xcode 4已经发生了变化,因为您通常不再拥有可以创建连接的main.xib,而是以编程方式执行几乎所有这些连接.

我已尝试使用相同的代码而不使用"IBOutlet"添加:

rootViewController = [[RootViewController]alloc] init;
Run Code Online (Sandbox Code Playgroud)

但似乎没什么用.

任何人都可以帮忙吗?

提前致谢

jus*_*tin 16

您基本上想要在应用程序委托中创建视图控制器的ivar.

ViewController *myVC;
@property (nonatomic, retain) IBOutlet ViewController *myVC;
Run Code Online (Sandbox Code Playgroud)

然后在实现文件中合成它.

然后当视图控制器加载时,调用以下内容:

- (void)viewDidLoad {
    AppDelegateClass *appDelegate = (AppDelegateClass *)[[UIApplication sharedApplication] delegate];
    appDelegate.myVC = self;
}
Run Code Online (Sandbox Code Playgroud)

此时,您现在可以从应用程序委托直接连接到视图控制器.同样,您也可以从视图控制器调用app delegate方法.在这种情况下,您将在视图控制器的标题中设置一个委托.

id delegate;
@property (nonatomic, assign) id delegate;
Run Code Online (Sandbox Code Playgroud)

再次在实现文件中合成它.

现在,当你在viewDidLoad,你会打电话给这样的事情:

- (void)viewDidLoad {
    self.delegate = (AppDelegateClass *)[[UIApplication sharedApplication] delegate];
}
Run Code Online (Sandbox Code Playgroud)

这应该会给你你需要的东西,所以我希望有所帮助

  • 我知道这是一个老线程,但我认为这不值得一个真正的单独问题:我尝试了你的第一部分回答(连接viewController-> appDelegate),但在"appDelegate.myVC = self"行,Xcode说` "使用ARC"不允许将Objective-C指针隐式转换为'int*'.你的答案只是非ARC吗?如果是的话,你能帮帮我吗? (2认同)