2014-10-30 28 views
1

我想重用用於在用戶點擊屏幕上的任何位置時關閉文本字段的代碼。我試圖遵循單一責任原則,所以將這個功能放入超類並繼承它並不是一個好主意。辭職文本字段 - 代碼重用

這是我目前有:

TextFieldResigner.m:

@implementation TextFieldResigner 

+ (void)autoDismissTextFieldsFromViewController:(UIViewController *)viewController { 
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:viewController action:@selector(resignOnTap)]; 
    [singleTap setNumberOfTapsRequired:1]; 
    [singleTap setNumberOfTouchesRequired:1]; 
    [viewController.view addGestureRecognizer:singleTap]; 
} 

@end 

我的視圖控制器類:

@interface EnrollQuestionsViewController() 

@end 

@implementation EnrollQuestionsViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [TextFieldResigner autoDismissTextFieldsFromViewController:self]; 
} 

- (void)resignOnTap { 
    [_myTextField resignFirstResponder]; 
} 

@end 

這種解決方案只是不覺得它巧妙地組合在一起。試圖完成此任務的更正確的方法是什麼?

回答

1

該解決方案非常容易出錯。您正在接受UIViewController類的對象,然後期待他們有一個自定義的resignOnTap選擇器。

順便說一下,您的autoDismissTextFieldsFromViewController:選擇器有誤導性;它正在註冊UIGestureRecognizers最終會自動關閉文本字段。它的名字表明它本身會解散文本字段。

調用返回從canBecomeFirstResponderYES會自動對以前的第一個響應者resignFirstResponder火災的對象becomeFirstResponder。你可以只是把這個在您的viewDidLoad

[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(becomeFirstResponder)]]; 

,並添加到您的視圖控制器:

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

你將不得不使用UITapGestureRecognizer爲你做這項工作的時候需要注意。如果您的屏幕上有其他UITapGestureRecognizer s,則可能會導致您的水龍頭無法啓動,具體取決於您的UIGestureRecognizerDelegate實施(如果有)。

+0

感謝您的提示。不幸的是,它看起來像becomeFirstResponder不強制resignFirstResponder。 – 2014-10-30 19:19:56

+0

如果你已經期望類有'resignOnTap',那麼爲什麼不建立一個你所有其他視圖控制器派生自的'UIViewController'子類呢? – 2014-10-30 19:24:30

+0

這可能是我應該做的。我已經擁有了一個UIViewController子類,它的所有視圖控制器派生自我,我只是擔心向其添加此功能可能會導致視圖控制器中不使用此功能的一些不可預見的問題。我很害怕打破子類應該想要所有基類功能的原則。 – 2014-10-30 19:26:50