0

我正在尝试在 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 个视图,这个视图在应用程序委托的 didfinishloading 方法中加载,然后应用程序在第一个视图中打开,这是视图 ViewDidAppear 的日志,就像您在回答中所做的那样:

<FirstView: 0xae10280>

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

<SecondView: 0x9f79b10>

然后我切换到thirdView,这是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 视图的问题......

4

1 回答 1

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 {

}
于 2012-12-13T16:52:35.507 回答