0

.h ファイルでプロトコルとして宣言された dateSelectViewController というメソッドがあります。

@class DateSelectViewController;
@protocol DateSelectViewControllerDelegate 

- (void)dateSelectViewController:(DateSelectViewController *)sender
                         theDate:(id)stringDate;

@end

プロトコルの下で、デリゲートを宣言しています。

@property (nonatomic, weak) id <DateSelectViewControllerDelegate> delegate;

実装ファイルでは、デリゲートを合成し、ビューで完了ボタンが押されたときにメッセージをデリゲートに送信します。

- (IBAction)DonePressed:(id)sender {
    NSDate *chosen = [datePicker date];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

    [formatter setDateFormat:@"MM/dd/yyyy"];
    NSString *formatedDate = [formatter stringFromDate:chosen];

    //sending a message to the delegate
    [self.delegate dateSelectViewController:self theDate:formatedDate];

    [self.navigationController popViewControllerAnimated:YES];
}

委任されている .h ファイルで、委任者の .h ファイルをインポートしています。.m ファイルでは、プロトコルに準拠しています。

@interface MakePlantTVC ()<DateSelectViewControllerDelegate>
- (void)dateSelectViewController:(DateSelectViewController *)sender
                     theDate:(id)stringDate
{
    self.displayDate.text = stringDate;
    NSLog(@"delegate working");
}

何らかの理由で、これはまったく機能しています。私の委任者クラスで完了ボタンが押されると、ボタンは想定どおりに動作し、View Controller をポップしますが、メッセージが委任者に送信されないようです。最初は、メッセージを nil に送信できると思っていましたが、そのタイプは id であったため、そうではありません。メッセージが送信されないのはなぜですか?

4

1 に答える 1

6

いくつか思い浮かんだ

  • デリゲートを設定しましたか?ばかげているように聞こえるかもしれませんが、デリゲートが機能しない場合、90% の確率で IB 接続を忘れるか、失われることが原因です。
  • 弱いオブジェクトの有効期限は切れていますか? 弱いオブジェクトは nil'ed です - したがって、'何もない' に対してデリゲート操作を実行しています - おそらく、より多くの保持またはNSNotification

役に立つかもしれないデリゲートで私が実践しているその他のこと

  • アサート ベースのプログラミングを使用しますか? 必要な機能を備えたプロトコルがある場合、アサートする価値があります。つまり、次のようになります。NSAssert(delegate, @"Error, delegate not set!");
  • デリゲートがセレクターに応答するかどうかを確認する
  • デリゲート呼び出しを GCD と非同期でディスパッチします。つまり、次のようになります。

    dispatch_async(dispatch_get_main_queue(), ^{
      if ([delegate_ respondsToSelector:@selector(updateUI:)]) 
        [delegate_ updateUI:self];
    });
    

お役に立てれば!

于 2012-04-25T12:49:10.997 に答える