2013-02-26 189 views
2

我试图在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]; 
} 

这些方法都被调用。我试图找出是否因为我没有设置委托,但我不明白我该如何做到这一点。在我的TableViewController中没有我的DetailViewController的实例,那么我该如何设置它的一个属性?是不是有一个委托,我不需要创建类之间的具体链接的整个点?非常非常困惑。

+0

如何从TableViewController中调用DetailViewController类? – 2013-02-26 11:44:06

+0

我正在使用'prepareForSegue'。 – Luke 2013-02-26 11:47:24

+0

是Levi建议检查。 – 2013-02-26 11:49:53

回答

5

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

您必须有一个类创建TableViewController和DetailViewController?在创建时,你会打电话

[myDetailViewControllerObject setDelegate:myTableViewControllerObject];

设置委托。这是假设你定义在DetailViewController委托财产与

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

代表进一步解释:

委托的一点是,这样你就不需要一个特定类型的对象,你只需要一个实现协议的对象。委托人和“委托人”之间还需要有联系。如果你不想要具体的连接,那么你会想要使用一个NSNotification,这非常“大喊大叫,希望有些东西在听”的沟通方式。

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

+0

我认为代表的整个观点是你不需要类之间的具体联系。一个代表只会从这些消息中发现这些消息? – Luke 2013-02-26 11:52:15

+0

我编辑了我的答案,以进一步解释代表的使用 – iain 2013-02-26 12:09:34

+0

非常感谢,先生! – Luke 2013-02-26 12:18:52

1

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

myDetailController.delegate = self;

0

有非常vew的情况下,你应该保留一个委托,通常你的delagate将超过对象。因此,将您的财产从保留更改为分配。并确保您正在设置代表。你在哪里做?如果你的对象真的依赖于它,你应该将它传递给构造函数(iniWithDelegate)。在调用delagate方法之前,尝试执行NSLog以查看它是否不为零。

嘿,只是看看这个link。链接帮助我一次。我希望它也能帮助你。

+0

我没有在任何地方使用'retain',不确定你的意思吗? – Luke 2013-02-26 11:55:06

+0

哦......等等。我将编辑我的答案。 – 2013-02-26 11:55:45

0

添加委托DetailViewControllerDelegate在TableViewController.h:

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

然后在TableViewController.m:

@synthesize delegate; 

现在打电话给你的委托方法:

[delegate detailViewControllerDidLike]; 

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

taleViewControllerInstanceName.delegate=self; 
1

请确保以下事项为委托。

创建物业

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

合成它,但不要松开你的对象

@synthesize delegate; 

设置委托。

settingsViewController.delegate = self; 
相关问题