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

时间:2013-02-26 11:42:17

标签: ios objective-c core-data delegates master-detail

我尝试在TableViewControllerDetailViewController之间设置一个非常基本的委托,但这些方法永远不会被调用。这是我的代码:

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];
}

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

5 个答案:

答案 0 :(得分:5)

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

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

[myDetailViewControllerObject setDelegate:myTableViewControllerObject];

设置委托。这假设您已使用

在DetailViewController中定义了委托属性
@property (readwrite, weak) id<DetailViewcontrollerDelegate> delegate;

代表们的进一步解释:

委托的意义在于您不需要特定类型的对象,您只需要一个实现协议的对象。代表和&#34;委托人之间仍然需要建立联系。如果你不想要具体的连接,那么你会想要使用NSNotification,这非常像是对以太的大喊大叫,并且希望有些人正在倾听&#34;沟通方式。

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

答案 1 :(得分:1)

也许你忘了设置代表。在你写的prepareForSegue中:

myDetailController.delegate = self;

答案 2 :(得分:1)

请确保代表的事情如下。

创建属性

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

合成它但不释放它

@synthesize delegate;

在对象上设置委托。

settingsViewController.delegate = self;

答案 3 :(得分:0)

有很多情况你应该保留一个代表,通常你的delagate会比对象活得更久。因此,将您的财产从保留更改为分配。并确保您正在设置代表。你在哪做什么?如果你的对象真的依赖它,你应该在构造函数(iniWithDelegate)中传递它。在调用delagate方法之前尝试执行NSLog只是为了查看它是否为零。

嘿,看看这个link。链接帮了我一次。我希望它也能帮到你。

答案 4 :(得分:0)

在TableViewController.h中添加DetailViewControllerDelegate的委托:

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

然后在TableViewController.m中:

@synthesize delegate;

现在将您的委托方法称为:

[delegate detailViewControllerDidLike];

最重要的是:在主视图中添加TableViewController的地方,不要忘记写:

taleViewControllerInstanceName.delegate=self;