2012-09-07 60 views
0

我試圖開發一個控件,它將模仿UITableView控件的行爲。我已經定義了一個代表協議如下:在自定義視圖中重現tableView委託行爲

@protocol HPSChoiceDelegate 

- (void)choiceView:(HPSChoice *)choiceView didSelectChoice:(NSNumber*)selectedIndex; 

@end 

用戶可以點擊主控制視圖中的子視圖。我有TapGesture識別器,在主控制視圖內激活了方法。我把這些連線如下:

UITapGestureRecognizer *containerTap = 
     [[UITapGestureRecognizer alloc] initWithTarget:self 
               action:@selector(didSelectChoice:)]; 

然後我在視圖中有一個方法,試圖在委託中調用正確的方法。在視圖中的方法是這樣的:

-(void)didSelectChoice:(UITapGestureRecognizer*)sender 
{ 
    NSNumber* selectedIndex = [NSNumber numberWithInt:sender.view.tag]; 

    [(id)self.delegate performSelector:@selector(didSelectChoice:) withObject:selectedIndex afterDelay:0.0f]; 
} 

在委託控制器I定義了下列方法:

- (void)choiceView:(HPSChoice *)choiceView didSelectChoice:(NSNumber*)selectedChoice 
{ 
    NSLog(@"HPSFormController didSelectChoice:(HPSChoice*)choiceView tag = %@",[[choiceView class] description]); 
} 

這一切都編譯,並且當我挖掘控制,則didSelectChoice被稱爲在該視圖然後在委託中調用該方法。但是,代理方法崩潰,出現以下錯誤:

-[HPSFormController didSelectChoice:]: unrecognized selector sent to instance 0x29b4e0 

如何解決此問題?非常感謝。

+0

只是一個提示:你不能保證有一個委託,如果它沒有被標記爲強制性的,它也不會對選擇器做出回答。所以,這樣做:'if(delegate && [delegate respondsToSelector:@selector(foo :)]){[delegate performSelector:@selector(foo :) withObject:bar]; ]' – Cyrille

回答

1

的方法是崩潰,因爲你在呼喚

didSelectChoice: 

,而你所定義的方法是

choiceView:didSelectChoice: 

我相信,你可以通過調用解決這個問題:

[(id)self.delegate performSelector:@selector(choiceView:didSelectChoice:) withObject:choiceView withObject:selectedIndex]; 

當然,你必須在你的didSelectChoice方法中獲得choiceView。

+0

太好了 - 非常感謝 – whatdoesitallmean

1

例如,如果您的視圖被稱爲HPSChoiceView,那麼您還需要說它的委託是它創建該視圖的控制器。

例如,某委託控制器內(HPSFormController我想)你需要做的:

HPSChoiceView* choiceView = // alloc-init here 
// self refers to an instance of HPSFormController at run-time 
choiceView.delegate = self; 

這意味着每次在該視圖中點擊時間,控制器將到自來水,因爲它有迴應被確定爲其代表。

此外,您正在調用錯誤的選擇器。與其說

[self.delegate performSelector:@selector(didSelectChoice:) withObject:selectedIndex afterDelay:0.0f]; 

通話

[self.delegate performSelector:@selector(choiceView:didSelectChoice:) withObject:choiceView withObject:selectedIndex]; 

choiceView可以從sender.view檢索。 senderUITapGestureRecognizer的遺漏,因此您可以檢索被點擊的視圖。

要理解選擇器是什麼,你可以看到Selectors in Objective CApple doc

說這個,我也會改變你的代表HPSChoiceDelegate的選擇器。因此,舉例來說,我把它叫做(只是爲了清楚起見):

- (void)didSelectChoiceView:(HPSChoice *)choiceView withSelectedIndex:(NSNumber*)selectedIndex; 

如果您使用此,選擇將didSelectChoiceView:withSelectedIndex:。注意冒號!

此外,我會在調用委託方法之前添加一個控件,如@Cirylle所建議的那樣。該控件允許您驗證您是否設置了委託(我的答案的第一部分),並且委託可以響應該選擇,因爲它已正確實施。

希望有所幫助。

+0

非常感謝 - 不確定當兩個人如此有幫助地回答時,程序是什麼,對不給予您正確答案的道歉 – whatdoesitallmean

+0

@whatdoesitallmean沒問題。如果你想,你可以upvote我的答案。乾杯。 –

0

應充當代表的類必須聲明並符合HPSChoiceDelegate協議,並且還必須註冊自己作爲您的UITableView'ish類的代表。

此外,請嘗試更改爲@selector(choiceView:didSelectChoice:)