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>

次に、2番目のビューに切り替えます。これは、デリゲートのviewdidappearnslogです。

<SecondView: 0x9f79b10>

次に、thirdViewに切り替えます。これは、nslogです。

<ThirdView: 0xba86200>

最後はFourthViewです。

<FourtView: 0xba875b0>

すべてのデリゲートがすべてのビューで機能しているようです。最初のビューに切り替えようとしました。これがログです。

(null)

3番目のビューを切り替えます。

(null)

二番目:

(null)

第4:

(null)

もう動作しないので、アプリケーションを停止して再度実行し、firstViewから開始します。

<FirstView: 0xad28730>

2番目のビューに切り替えます。

<SecondView: 0x9f682e0>

firstViewに戻ります。

(null)

2番目のビューに切り替えます。

(null)

3番目のビューに切り替えます。

<ThirdView: 0xab297e0>

fourViewに切り替えます。

<FourthView: 0xab28430>

次に、再び3番目のビューに移動します。

(null)

問題がわかるように、最初は機能し、ビューに戻ったときにデリゲートがnullになるということですが、何か考えはありますか?

編集2:

また、NavigationController間でビューを切り替えると、デリゲートが(null)になることはなく、代わりに、コードがnullを与えるようにUITabBarControllerでビューを切り替えることに気付きました...したがって、UITabBarControllerビューの問題だと思います...

4

1 に答える 1

1

オブジェクトは、一度に 1 つのデリゲートのみを持つことができます。FirstView の viewWillDisappear メソッドでデリゲートを nil に設定してみて、それが役立つかどうかを確認してください。

これは私にとってはうまくいきました。最初のコントローラーでデリゲートの設定を viewWillAppear に移動したので、2 番目のコントローラーに戻るとリセットされます。私のコントローラーはナビゲーションコントローラーにあり、プッシュとポップを使用して前後に移動しています。両方のコントローラーには、次の同じコードがあります (ログを除く)。

#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 に答える