我正在尝试在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视图的问题我认为..
答案 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 {
}