为什么我的委托方法从未调用过?

Luk*_*uke 2 delegates core-data objective-c master-detail ios

我试图在a TableViewController和a 之间建立一个非常基本的委托DetailViewController,但是从不调用这些方法.这是我的代码:

DetailViewController.h

@protocol DetailViewControllerDelegate

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

@end
Run Code Online (Sandbox Code Playgroud)

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]);
}
Run Code Online (Sandbox Code Playgroud)

TableViewController.h接口行:

@interface TableViewController : UITableViewController <NSFetchedResultsControllerDelegate, DetailViewControllerDelegate>
Run Code Online (Sandbox Code Playgroud)

TableViewController.m

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

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

- (void) detailViewControllerDidDislike
{
    NSLog(@"detailViewControllerDidDislike!");
    [self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)

这些方法都不会被调用.我正在努力弄清楚是不是因为我没有设置代表,但我不明白我是怎么做到的.在我的DetailViewController中没有我的实例TableViewController,所以我应该如何设置其中一个属性?拥有委托是不是我不需要在类之间创建具体的链接?非常非常困惑.

iai*_*ain 5

您需要设置委托,以便调用委托方法.

你必须有一个创建TableViewController和DetailViewController的类?当它们被创建时你会打电话

[myDetailViewControllerObject setDelegate:myTableViewControllerObject];

设置代理.这假设你已经在DetailViewController中定义了一个委托属性

@property (readwrite, weak) id<DetailViewcontrollerDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

代表们的进一步解释:

委托的要点是您不需要特定类型的对象,您只需要一个实现协议的对象.代表和"委托人"之间仍然需要建立联系.如果你不想要具体的连接,那么你会想要使用一个NSNotification,这是一个非常"呼喊以太,并希望有所收听"的沟通方法.

在这种情况下,委托是正确的使用方法.代表应该是一对一的关系,NSNotification最好用于一对一的N型关系,其中N可以是0或更多.