2013-02-26 196 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; 
相關問題