2

TableViewControlleraと a の間に非常に基本的なデリゲートを設定しようとしましたDetailViewControllerが、メソッドが呼び出されません。これが私のコードです:

DetailViewController.h

@protocol DetailViewControllerDelegate

- (void) detailViewControllerDidLike;
- (void) detailViewControllerDidUnlike;
- (void) detailViewControllerDidDislike;

@end

DetailViewController.m

- (IBAction) changeLikedSwitch: (id) sender
{
    UISwitch *likedSwitch = (UISwitch *) sender;
    if ([likedSwitch isOn]) {
        [_selectedQuote setIsLiked: [NSNumber numberWithBool: YES]];
        [self.delegate detailViewControllerDidLike];
    } else {
        [_selectedQuote setIsLiked: [NSNumber numberWithBool: NO]];
        [self.delegate detailViewControllerDidUnlike];
    }

    NSError *error;
    if (![[[CDManager sharedManager] managedObjectContext] save:&error]) NSLog(@"Saving changes failed: %@, %@", error, [error userInfo]);
}

- (IBAction) changeDislikedSwitch: (id) sender
{
    UISwitch *dislikedSwitch = (UISwitch *) sender;
    if ([dislikedSwitch isOn]) {
        [_selectedQuote setIsDisliked: [NSNumber numberWithBool: YES]];
        [self.delegate detailViewControllerDidDislike];
        [self dismissViewControllerAnimated: YES completion: nil];
    } else {
        [_selectedQuote setIsDisliked: [NSNumber numberWithBool: NO]];
    }

    NSError *error;
    if (![[[CDManager sharedManager] managedObjectContext] save:&error]) NSLog(@"Saving changes failed: %@, %@", error, [error userInfo]);
}

TableViewController.h インターフェイス行:

@interface TableViewController : UITableViewController <NSFetchedResultsControllerDelegate, DetailViewControllerDelegate>

TableViewController.m

- (void) detailViewControllerDidLike
{
    NSLog(@"detailViewControllerDidLike!");
    [self.tableView reloadData];
}

- (void) detailViewControllerDidUnlike
{
    NSLog(@"detailViewControllerDidUnlike!");
    [self.tableView reloadData];
}

- (void) detailViewControllerDidDislike
{
    NSLog(@"detailViewControllerDidDislike!");
    [self.tableView reloadData];
}

これらのメソッドは呼び出されません。デリゲートを設定していないためかどうかを調べようとしていますが、どうすればそれができるのかわかりません。DetailViewControllermyには myのインスタンスがありません。TableViewControllerでは、そのプロパティの 1 つをどのように設定すればよいのでしょうか? クラス間の具体的なリンクを作成する必要がないデリゲートを持つことの要点ではありませんか? ここで非常に混乱しています。

4

5 に答える 5

5

デリゲートメソッドを呼び出すには、デリゲートを設定する必要があります。

TableViewControllerとDetailViewControllerの両方を作成するクラスが必要ですか?それらが作成されたときにあなたは呼び出すでしょう

[myDetailViewControllerObject setDelegate:myTableViewControllerObject];

デリゲートを設定します。これは、DetailViewControllerでデリゲートプロパティを次のように定義したことを前提としています。

@property (readwrite, weak) id<DetailViewcontrollerDelegate> delegate;

代表者の詳細な説明:

デリゲートのポイントは、特定のタイプのオブジェクトを必要とせず、プロトコルを実装するオブジェクトのみを必要とすることです。デリゲートと「デリゲーター」の間にはまだ接続が必要です。具体的な接続が必要ない場合は、NSNotificationを使用することをお勧めします。これは、非常に「エーテルに向かって叫び、何かが聞いていることを願う」通信方法です。

この場合、デリゲートを使用するのが正しいです。デリゲートは1対1の関係に使用する必要があります。NSNotificationは、Nが0以上の1対Nタイプの関係に最適です。

于 2013-02-26T11:47:50.507 に答える
1

デリゲートを設定するのを忘れた可能性があります。あなたがprepareForSegue書く:

myDetailController.delegate = 自己;

于 2013-02-26T11:48:41.300 に答える
1

デリゲートについては、次のことを確認してください。

プロパティの作成

@property(nonatomic, assign) id < SettingsViewControllerDelegate > delegate;

合成するが解放しない

@synthesize delegate;

オブジェクトにデリゲートを設定します。

settingsViewController.delegate = self;
于 2013-02-26T12:00:47.767 に答える
0

デリゲートを保持する必要がある非常にまれな状況があります。通常、デリゲートはオブジェクトよりも長生きします。そのため、プロパティを保持から割り当てに変更してください。そして、デリゲートを設定していることを確認してください。どこでやってる?オブジェクトが実際にそれに依存している場合は、コンストラクター ( ) で渡す必要がありますiniWithDelegateNSLogdelagate メソッドを呼び出す前にa を実行して、 nil でないかどうかを確認してください。

ちょっと、このリンクを見てください。リンクは一度私を助けました。あなたにも役立つことを願っています。

于 2013-02-26T11:53:53.993 に答える
0

TableViewController.h に DetailViewControllerDelegate のデリゲートを追加します。

#import "DetailViewController.h"
@property (retain, nonatomic) id <DetailViewControllerDelegate>delegate;

次に、TableViewController.m で:

@synthesize delegate;

デリゲート メソッドを次のように呼び出します。

[delegate detailViewControllerDidLike];

最も重要: メイン ビューで TableViewController を追加する場所に、次のように記述することを忘れないでください。

taleViewControllerInstanceName.delegate=self;
于 2013-02-26T11:58:17.013 に答える