我尝试在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];
}
这些方法都不会被调用。我正在努力弄清楚是不是因为我没有设置代表,但我不明白我是怎么做到的。我的DetailViewController
中没有TableViewController
的实例,所以我该如何设置其中一个属性?拥有委托是不是我不需要在类之间创建具体的链接?非常,非常困惑。
答案 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
只是为了查看它是否为零。
答案 4 :(得分:0)
在TableViewController.h中添加DetailViewControllerDelegate的委托:
#import "DetailViewController.h"
@property (retain, nonatomic) id <DetailViewControllerDelegate>delegate;
然后在TableViewController.m中:
@synthesize delegate;
现在将您的委托方法称为:
[delegate detailViewControllerDidLike];
最重要的是:在主视图中添加TableViewController的地方,不要忘记写:
taleViewControllerInstanceName.delegate=self;