2

我试图在 aTableViewController和 a之间设置一个非常基本的委托DetailViewController,但从未调用过这些方法。这是我的代码:

DetailViewController.h

@protocol DetailViewControllerDelegate

- (void) detailViewControllerDidLike;
- (void) detailViewControllerDidUnlike;
- (void) detailViewControllerDidDislike;

@end

细节视图控制器.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>

表视图控制器.m

- (void) detailViewControllerDidLike
{
    NSLog(@"detailViewControllerDidLike!");
    [self.tableView reloadData];
}

- (void) detailViewControllerDidUnlike
{
    NSLog(@"detailViewControllerDidUnlike!");
    [self.tableView reloadData];
}

- (void) detailViewControllerDidDislike
{
    NSLog(@"detailViewControllerDidDislike!");
    [self.tableView reloadData];
}

这些方法都没有被调用。我正在尝试确定是否是因为我没有设置委托,但我不明白我该怎么做。DetailViewControllermy中没有 my 的实例TableViewController,那么我应该如何设置它的属性之一呢?拥有一个我不需要在类之间创建具体链接的委托不是重点吗?这里非常非常困惑。

4

5 回答 5

5

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

您必须有一个同时创建 TableViewController 和 DetailViewController 的类?创建它们时,您会调用

[myDetailViewControllerObject setDelegate:myTableViewControllerObject];

设置委托。这是假设您已经在 DetailViewController 中定义了一个委托属性

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

代表的进一步解释:

委托的意义在于您不需要特定类型的对象,您只需要一个实现协议的对象。委托人和“委托人”之间仍然需要建立联系。如果你不想要具体的连接,那么你会想要使用 NSNotification,这是一种非常“向以太大喊,并希望有东西在听”的通信方法。

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

于 2013-02-26T11:47:50.507 回答
1

也许你忘了设置委托。在prepareForSegue你写:

myDetailController.delegate = 自我;

于 2013-02-26T11:48:41.300 回答
1

请确保为代表做好以下事情。

创建属性

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

合成它但不释放它

@synthesize delegate;

在您的对象上设置委托。

settingsViewController.delegate = self;
于 2013-02-26T12:00:47.767 回答
0

在某些情况下,您应该保留委托,通常您的委托将比对象寿命长。因此,将您的属性从保留更改为分配。并确保您正在设置委托。你在哪里做?如果你的对象真的依赖它,你应该在构造函数(iniWithDelegate)中传递它。在调用 delagate 方法之前尝试做一个NSLog,看看它是否不为零。

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

于 2013-02-26T11:53:53.993 回答
0

在 TableViewController.h 中为 DetailViewControllerDelegate 添加一个委托:

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

然后在 TableViewController.m 中:

@synthesize delegate;

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

[delegate detailViewControllerDidLike];

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

taleViewControllerInstanceName.delegate=self;
于 2013-02-26T11:58:17.013 回答