在AppDelegate中使用自定义委托

时间:2012-12-13 16:48:53

标签: iphone ios delegates appdelegate

我正在尝试在App Delegate中添加自定义委托,我正在这样做:

AppDelegate.h

@protocol AppDelegateDelegate <NSObject>

- (void)finishSync:(BOOL)success;

@end

@interface AppDelegate : UIResponder <UIApplicationDelegate> {

@property (nonatomic, weak) id <AppDelegateDelegate> delegate;

@end

然后我试图在UITabViewController中连接的其他视图中使用此委托,我这样做:

FirstView.h

#import "AppDelegate.h"

@interface FirstView : UIViewController <AppDelegateDelegate>

@end

FirstView.m

@implementation FirstView

...

- (void)viewDidLoad {
  AppDelegate *appController = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  appController.customDelegate = self;

}

FirstView工作正常,但是例如,如果我切换到具有相同代码的SecondViewController来实现委托,那么委托在FirstView中也不再起作用......我错了什么?

修改

我已经尝试了rdelmar的答案,但是没有工作,现在我更好地解释了我的情况,我在UITabBarController中有4个视图,这个视图是在app delegate中的didfinishloading方法中加载的,然后app打开了第一个视图,这是ViewDidAppear中的日志,就像你在答案中所做的那样:

<FirstView: 0xae10280>

然后我切换第二个视图,这是deleagate的viewdidappear nslog:

<SecondView: 0x9f79b10>

然后我切换到第三个视图,这是nslog:

<ThirdView: 0xba86200>

,最后一个是FourthView:

<FourtView: 0xba875b0>

似乎所有委托都在所有视图中工作,然后我尝试切换到第一个视图,这是日志:

(null)

我切换第三个视图:

(null)

第二个:

(null)
第四个:

(null)

不再工作了,所以我停止了应用程序并再次运行它,并从firstView开始:

<FirstView: 0xad28730>

切换到第二个视图:

<SecondView: 0x9f682e0>

在firstView中返回:

(null)

切换到第二个视图:

(null)

切换到第三个视图:

<ThirdView: 0xab297e0>

切换到第四视图:

<FourthView: 0xab28430>

然后再次进入第三种观点:

(null)

所以你可以看到问题是第一次有效,然后当一个视图返回时委托为空,有什么想法吗?

编辑2:

我还注意到如果我在NavigationController之间切换视图,委托永远不会(null),而是像我一样在UITabBarController中切换视图,我的代码给出了null ...所以这是UITabBarController视图的问题我认为..

1 个答案:

答案 0 :(得分:1)

一个对象一次只能有一个委托。尝试在FirstView的viewWillDisappear方法中将委托设置为nil,看看是否有帮助。

这对我有用。我将委托的设置移动到第一个控制器中的viewWillAppear,因此如果我从第二个控制器返回到它,它将重置。我的控制器在导航控制器中,我正在使用推动和弹出来回。两个控制器都有相同的代码(日志除外):

#import "ViewController.h"
#import "AppDelegate.h"

@interface ViewController ()
@property (strong,nonatomic) AppDelegate *appController;
@end

@implementation ViewController //This is the first controller


-(void)viewDidAppear:(BOOL)animated {
    self.appController = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    self.appController.customDelegate = self;
    [super viewDidAppear:animated];
    NSLog(@"First says: %@",self.appController.customDelegate);
}


-(void)viewWillDisappear:(BOOL)animated {
    NSLog(@"First viewWillDisappear");
    [super viewWillDisappear:animated];
    self.appController.customDelegate = nil;
}

- (void)finishSync:(BOOL)success {

}