0

ある VC から別の VC に値を渡すためにデリゲートを使用しようとしています。私はそれが機能するはずの方法を誤解していると思います。

メインの ViewController.h には次のものがあります。

@protocol defaultLocationChoice <NSObject>

- (NSString *) locChoice;

@end

私のPreferencesViewController.hとChooseServerViewController.hの両方で、@interfacedefaultLocationChoiceセクションで宣言し、プロパティを次のように割り当てました。

@property (nonatomic, assign) id <defaultLocationChoice> locationDelegate;

どちらも合成されています。

ユーザーが PreferencesViewController から ChooseServerViewController にセグエする場合、セグエ コードの準備は次のとおりです。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([segue.identifier isEqualToString:@"toServerChoice"]) {
        ChooseServerViewController *viewController = (ChooseServerViewController *)segue.destinationViewController;
        viewController.locationDelegate = self;

    }

}

ChooseServerViewController でセルの選択が行われると、次のように呼び出します。

[self locChoice];

それは次のとおりです。

- (NSString *) locChoice {
    NSLog(@"Cell Vale Loc choice %@",cellValue);
    return cellValue;
}

NSLog は、正しい値が返されることを確認します。

さて、私が理解していると思うように、デリゲートの LocChoice の値が返される値になりましたね。

ユーザーが戻ると (NavController)、PreferencesViewController は次のようになります。

-(void) viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];
    defaultLocation = [locationDelegate locChoice];
    [self.tableView reloadData];  
}

defaultLocation の値が locChoice に渡された値と等しくなると予想していました。ただし、テーブルがリロードされると、問題のセルはまだ空白であり、私が期待していることは起こっていません。

何か案は?

4

2 に答える 2

2

私があなたのコードに適切に従っていれば、言及されたプロトコルを で採用する必要はありませChooseServerViewControllerPreferencesViewController

理由は、データを前のView Controllerに送り返したいからです。試す:

@protocol defaultLocationChoice <NSObject>
    - (void) locChoice:(NSString*)choice;
@end

そのメソッドをPreferencesViewController実装して、選択を受け取るようにします。それを適切なインスタンス変数に格納する必要があります。

// in PreferencesViewController.m
-(void)locChoice:(NSString*)choice {
    self.choice = choice;  // this just my example
}

選択が ( でChooseServerViewController) 行われ、選択を送り返す場合は、次のように呼び出します。

// this is in 'ChooseServerViewController.m' some where appropriate
[self.delegate locChoice:cellValue];

あなたの実装は、セル値で何もしていません(保存することさえせず、ログに記録するだけです)。に戻るとPreferencesViewController、選択した値が表示され、View Controller はそれを使用して必要な操作を実行できます。

プロトコルは、Java や C# のインターフェイスに似ていますが、より柔軟です。

更新

の宣言は次のChooseServerViewControllerようになります。

#import "FileWithProtocolDecalration.h"
@interface ChooseServerViewController
.
.
.
@property ( nonatomic,assign) id<defaultLocationChoice> delegate;
.
.
.
@end
于 2013-03-09T03:41:17.807 に答える
0

あなたはそこにいくつかの誤解を持っていると思います

プロトコルとデリゲートは渡されるものです。つまり、誰かが受信者であり、誰かが送信者である必要があります。あなたの場合。
プロトコルをこれに更新します

@protocol defaultLocationChoice <NSObject>

- (void)locChoice:(NSString *)updateString;  // the method from delegate and implementer must be exact

@end  

ViewController にプロトコルをレシーバーとして実装するように設定します。

@interface VCReceiver : UIViewController <defaultLocationChoice>

その後、VCReceiver で

- (void)viewDidLoad {  
    ChooseServerViewController *vcSender = [[ChooseServerViewController alloc] init];
    [vcSender setLocationDelegate:self]; // this is like saying. i have implemented method from protocol in this file (self)
}
- (void)locChoice:(NSString *)updateString {
    // update the VCReceiver here
    // or access vcSender value 
    // or use the updateString value
}

次に、ChooseServerViewController locChoice:メソッド(あなたの例のもの)でこれに置き換えて、[self updateChoice]代わりに呼び出します:

- (void)updateChoice {
    if ([self.locationDelegate respondsToSelector:@selector(locChoice:)]) {
         [self.locationDelegate locChoice:aStringToUpdate]; // this will call VCReceiver locChoice
   }

ChooseServerViewController実際には VCReceiver メソッドを呼び出して、値を読み取る準備ができたことを伝えているため、何も返す必要はありません。

于 2013-03-09T03:35:38.317 に答える