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,所以我应该如何设置其中一个属性?拥有委托是不是我不需要在类之间创建具体的链接?非常非常困惑.
您需要设置委托,以便调用委托方法.
你必须有一个创建TableViewController和DetailViewController的类?当它们被创建时你会打电话
[myDetailViewControllerObject setDelegate:myTableViewControllerObject];
设置代理.这假设你已经在DetailViewController中定义了一个委托属性
@property (readwrite, weak) id<DetailViewcontrollerDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)
代表们的进一步解释:
委托的要点是您不需要特定类型的对象,您只需要一个实现协议的对象.代表和"委托人"之间仍然需要建立联系.如果你不想要具体的连接,那么你会想要使用一个NSNotification,这是一个非常"呼喊以太,并希望有所收听"的沟通方法.
在这种情况下,委托是正确的使用方法.代表应该是一对一的关系,NSNotification最好用于一对一的N型关系,其中N可以是0或更多.