为什么我的委托方法从未被调用?
我试图在TableViewController
和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];
}
这些方法都被调用。我试图找出是否因为我没有设置委托,但我不明白我该如何做到这一点。在我的TableViewController
中没有我的DetailViewController
的实例,那么我该如何设置它的一个属性?是不是有一个委托,我不需要创建类之间的具体链接的整个点?非常非常困惑。
您确实需要设置委托,以便调用委托方法。
您必须有一个类创建TableViewController和DetailViewController?在创建时,你会打电话
[myDetailViewControllerObject setDelegate:myTableViewControllerObject];
设置委托。这是假设你定义在DetailViewController委托财产与
@property (readwrite, weak) id<DetailViewcontrollerDelegate> delegate;
代表进一步解释:
委托的一点是,这样你就不需要一个特定类型的对象,你只需要一个实现协议的对象。委托人和“委托人”之间还需要有联系。如果你不想要具体的连接,那么你会想要使用一个NSNotification,这非常“大喊大叫,希望有些东西在听”的沟通方式。
在这种情况下,委托使用是正确的。代表应该是一对一的关系,NSNotification最适用于一对N关系,其中N可以是0或更多。
也许你忘了设置代表。在你写的prepareForSegue
中:
myDetailController.delegate = self;
添加委托DetailViewControllerDelegate在TableViewController.h:
#import "DetailViewController.h"
@property (retain, nonatomic) id <DetailViewControllerDelegate>delegate;
然后在TableViewController.m:
@synthesize delegate;
现在打电话给你的委托方法:
[delegate detailViewControllerDidLike];
最重要的是:在主视图中添加TableViewController的地方,不要忘记写入:
taleViewControllerInstanceName.delegate=self;
请确保以下事项为委托。
创建物业
@property(nonatomic, assign) id <SettingsViewControllerDelegate> delegate;
合成它,但不要松开你的对象
@synthesize delegate;
设置委托。
settingsViewController.delegate = self;
如何从TableViewController中调用DetailViewController类? – 2013-02-26 11:44:06
我正在使用'prepareForSegue'。 – Luke 2013-02-26 11:47:24
是Levi建议检查。 – 2013-02-26 11:49:53