2017-05-03 57 views
3

我有一個非常小的Xcode項目與幾個視圖控制器。我發現自己在其中複製了以下方法:何時可以通過將代碼放在AppDelegate中來減少代碼重複?

- (void)postTip:(NSString *)message { 
    [self postInfoAlertWithTitle:@"Tip" andMessage:message andAction:@"Got it!"]; 
} 

- (void)postInfoAlertWithTitle:(NSString *)title andMessage:(NSString *)message andAction:(NSString *)action { 
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; 
    [alert addAction:[UIAlertAction actionWithTitle:action style:UIAlertActionStyleDefault handler:nil]]; 
    [self presentViewController:alert animated:YES completion:nil]; 
} 

當然,這讓我想到如何刪除(或至少減少)重複的代碼。

答案顯然是把所期望的行爲在父類,再有我的視圖控制器從類繼承。然而,一些視圖控制器的類型UICollectionViewController的,有些是類型的UITableViewController的,我不知道如何維護自己的收集和表口味,分別是我讓他們從一個假設MyViewController繼承的事件是,一個UIViewController中。

所以,我做了一些研究,並採取了看看協議。最初,這看起來很合適,除了你不能爲協議中聲明的方法提供默認的實現,這基本上是我想要的。

最後,有太多的猶豫和自我厭惡,我認爲把行爲在我AppDelegate類中,有一個額外的參數,以方便呈現警報:

- (void)postTip:(NSString *)message toController:(UIViewController *)controller; 
- (void)postInfoAlertWithTitle:(NSString *)title andMessage:(NSString *)message andAction:(NSString *)action toController:(UIViewController *)controller; 

在一個給定的視圖控制器看起來通話像這樣:

[self.appDelegate postTip:@"Git gud!" toController:self]; 

等瞧!我想要的行爲,我想要的行爲,以及我必須做的所有事情都得到了AppDelegate的實例!但是......這並不適合我。它似乎...臭。此外,仍然有一些重複,即聲明和初始化一個私有appDelegate屬性,我已經注意到了這一點,而不是在需要它的地方調用(AppDelegate *)[[UIApplication sharedApplication]委託],以便:

  • 我可以指定「弱」和避免可能保留週期
  • 我只取指針的AppDelegate(歡呼爲過早的優化>。<)

是否認爲是可接受使用的AppDelegate作爲存儲庫對於應用程序範圍的行爲,如實用程序方法,如果是這樣,我是不是必需的ily偏執實施重新:使用財產? (如果沒有,我有哪些選擇?)

+4

在'UIViewController'上創建一個類別,它具有方法(最初的,而不是AppDelegate的)。 'UICollectionViewController'和'UITableViewController'繼承自'UIViewController',所以應該沒問題。避免像這樣使用你的AppDelegate添加太多無關的信息。你現實中使用的是事實是它是一個單身(可以由你自己做出)。 – Larme

+1

您可以創建一個「TipHelper」類,並在您的各種控制器中使用該類的實例(或共享實例)。由於繼承不是一個簡單的選擇,組合是另一種可用策略。 –

+0

拉美 - 啊,我不知道類別!非常有趣,我認爲,只是票! – kuipersn

回答

0

這在我看來,類別被用於正是這種情況 - 雖然是別人的評論所指出的,也有更多的選擇 - 這是什麼我已經做好了。

若要查看蘋果的類別的文檔,請this page。 要添加在Xcode類別,看到this page

1

通過創建h和.m文件

肯定使用一個類的UIViewController + InfoAlert.h

@interface UIViewController (InfoAlert) 

- (void)postInfoAlertWithTitle:(NSString *)title andMessage:(NSString *)message andAction:(NSString *)action; 

@end 

的UIViewController + InfoAlert.m

#import "UIViewController+InfoAlert.h" 

@implementation UIViewController (InfoAlert) 

- (void)postInfoAlertWithTitle:(NSString *)title andMessage:(NSString *)message andAction:(NSString *)action { 
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; 
    [alert addAction:[UIAlertAction actionWithTitle:action style:UIAlertActionStyleDefault handler:nil]]; 
    [self presentViewController:alert animated:YES completion:nil]; 
} 

@end 

則只需導入你的UIViewController + InfoAlert。h您想在哪裏使用您的新postInfoAlertWithTitle方法