2017-04-21 3 views
1

が機能していません。プロトコル/代理人は私がのViewControllerから押してる3のUIViewController、すなわちのViewController、BViewControllerとCViewController、のViewControllerはUINavigationControllerからRootViewControllerで、</p> <p>を持って

私はCViewControllerでプロトコルを宣言しました。このプロトコルメソッドは、BViewControllerのために正常に動作していますが、ViewControllerでデリゲートメソッドを動作させる方法を理解していません。

View ControllerでCViewControllerのオブジェクトを作成し、そのデリゲートに対して自分自身を宣言しましたが、機能しませんが、以下は自分のコードです。私を助けてください。私がここで間違っているところ!すなわちBViewController

#import "BViewController.h" 
#import "CViewController.h" 

@interface BViewController()<testDelegates> 

@end 

@implementation BViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 

- (IBAction)bNextAction:(id)sender { 

    CViewController *cVC = [self.storyboard instantiateViewControllerWithIdentifier:@"CViewController"]; 

// cVC.mydelegate = self; 
    [self.navigationController pushViewController:cVC animated:YES]; 
} 

-(void)TestMethod{ 

    NSLog(@" Its Working If I uncomment to cVC.mydelegate = self"); 
} 

マイルートビューコントローラ、すなわちのViewController

#import "ViewController.h" 
#import "BViewController.h" 
#import "CViewController.h" 

@interface ViewController()<testDelegates> 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    CViewController *cVC = [self.storyboard instantiateViewControllerWithIdentifier:@"CViewController"]; 
    cVC.mydelegate = self; 
} 

- (IBAction)nextAction:(id)sender { 

    BViewController *bViewC = [self.storyboard instantiateViewControllerWithIdentifier:@"BViewController"]; 

    [self.navigationController pushViewController:bViewC animated:YES]; 
} 

-(void)TestMethod{ 

    NSLog(@" Its NOT Working"); 
} 

私の第二ビューコントローラ、と私はでプロトコルを宣言し、私の​​第三ビューコントローラ、。 hファイル、つまりCViewController

そして、.mファイル内は

#import "CViewController.h" 

@interface CViewController() 

@end 

@implementation CViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 

- (IBAction)cNextAction:(id)sender { 

    [self.mydelegate TestMethod]; 
} 

答えて

1

あなたがクラスを作成し、このクラスを使用すると、viewDidLoadメソッドを離れた後、破壊します。

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    CViewController *cVC = [self.storyboard instantiateViewControllerWithIdentifier:@"CViewController"]; 
    cVC.mydelegate = self; 
} 

私が理解しているように、ViewControllerではCViewControllerからいくつかのメソッドを実行する必要があります。

BViewControllerからdelegateとしてviewControllerを渡して、それをCViewControllerに渡すことができます。

それとも、このようなコードを使用することができます:

- (IBAction)cNextAction:(id)sender { 
    id<testDelegates> delegate = self.navigationController.viewControllers[0]; 
    if([delegate conformsToProtocol:@protocol(testDelegates)]) 
    { 
     [delegate TestMethod]; 
    } 
} 

これには最善の方法ではありませんが、それはだが仕事になります。

+0

はい、あなたは、CViewControllerからViewControllerにいくつかのアクションを実行する必要があります。コードでは、この行の[delegate conformsToProtocol:testDelegates]、 "testDelegates"は赤いマークになり、Used Undeclared Identifierと表示されます。 : –

+0

申し訳ありませんが、私は答えを修正しました – Sergey

+0

パーフェクト、そのワーキングパーフェクト..ありがとう:) –

1

はあなたがBViewControllerクラスに別のプロトコルを宣言する必要があり、この

self.delegate = self.navigationController.viewControllers[0]; 
+0

働いていても@Sergey答えがより堅牢です。あなたの助けをありがとう.. :) –

1

を試してみてください。

Please follow below steps. 

ステップ1:BViewController.h

@protocol testDelegates2 <NSObject> 

-(void)TestMethod2; 

@interface BViewController : UIViewController 

@property (weak) id <testDelegates> mydelegate; 


@end 
@implementation CViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 

- (IBAction)cNextAction:(id)sender { 

    [self.mydelegate TestMethod2]; 
} 

Step 2. In ViewController class conform Protocol 
@interface ViewController()<testDelegates> 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    CViewController *cVC = [self.storyboard instantiateViewControllerWithIdentifier:@"CViewController"]; 
    cVC.mydelegate = self; 
} 

- (IBAction)nextAction:(id)sender { 

    BViewController *bViewC = [self.storyboard instantiateViewControllerWithIdentifier:@"BViewController"]; 
cVC.mydelegate = self; //important line 
    [self.navigationController pushViewController:bViewC animated:YES]; 
} 

-(void)TestMethod2{ 

    NSLog(@"Final Output"); 
} 
+0

それは2つのVCでプロトコルを宣言することによって良い考えではないようだ。おもう。私は3番目のVCから最初のVCまで何らかのアクションが必要です –

+0

O.w NotificationCenterを使用しました。 ViewControllerに登録し、CViewControllerクラスから呼び出します。 –

+0

しかし、その良い考えではありません:/ –

1

あなたがCViewControllerのviewDidLoadメソッドに

self.mydelegate = self.navigationController.viewControllers[0] 

を入れてみてください、その後 のViewControllerにCViewControllerの委任を設定しようとしている場合。

これ以外の場合は、ViewControllerとBViewControllerを両方ともCViewControllerの代理人にしようとしています。このように、オブジェクトの代理人は一意にしかできません。これは、デリゲートが単にオブジェクトの参照を保持する変数であり、変数の値がある時点で一意になることがわかっていることを意味します。

したがって、ViewcontrollerとBViewControllerの両方でいくつかのタスクを実行する場合は、通知パターンを使用してください。 See apple doc here

関連する問題