14

ルート ビュー コントローラーからプッシュするビュー コントローラーとテーブル ビュー コントローラーがいくつかあります。これらすべてで、ナビゲーション コントローラーでカスタムの戻るボタンを使用したいと思います。戻るボタンを設定するメソッドを各クラス ファイルにコピーする代わりに、設定を行うクラス メソッドを含むヘルパー クラスを作成しました。以下のコードは機能しますが、間違った方法で行っているのではないかと思います。これを達成するためのより良い方法はありますか?また、私はまだすべてのクラスで -(void)myCustomBack メソッドを複製しており、それを回避する方法があるかどうか疑問に思っていました。

@interface NavBarBackButtonSetterUpper : NSObject
+ (UIButton *)navbarSetup:(UIViewController *)callingViewController;
@end

@implementation NavBarBackButtonSetterUpper

+ (UIButton *)navbarSetup:(UIViewController *)callingViewController
{
    callingViewController.navigationItem.hidesBackButton = YES;

    UIImage *backButtonImage = [[UIImage imageNamed:@"back_button_textured_30"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 13, 0, 5)];

    UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 30)];

    [backButton setBackgroundImage:backButtonImage forState:UIControlStateNormal];

    [backButton setTitle:@"Back" forState:UIControlStateNormal];
    backButton.titleLabel.font = [UIFont fontWithName:@"AmericanTypewriter-Bold" size:12];
    backButton.titleLabel.shadowOffset = CGSizeMake(0,-1);

    UIView *customBackView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 30)];
    [customBackView addSubview:backButton];

    callingViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customBackView];

    return backButton;
}
@end



@interface MyCustomTableViewController : UITableViewController
@end

@implementation MyCustomTableViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIButton *backButton = [NavBarBackButtonSetterUpper navbarSetup:self];

    [backButton addTarget:self  action:@selector(myCustomBack) forControlEvents:UIControlEventTouchUpInside];
}

- (void)myCustomBack
{
    [self.navigationController popViewControllerAnimated:YES];
}
@end


@interface MyCustomViewController : UIViewController
@end

@implementation MyCustomViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIButton *backButton = [NavBarBackButtonSetterUpper navbarSetup:self];

    [backButton addTarget:self  action:@selector(myCustomBack) forControlEvents:UIControlEventTouchUpInside];
}

- (void)myCustomBack
{
    [self.navigationController popViewControllerAnimated:YES];
}
@end
4

5 に答える 5

4

あなたの問題の解決策は継承だと思います。

のサブクラスを作成し、UIViewControllerすべてのカスタム ビュー コントローラーをこのカスタム サブクラスから継承させることができます。「親」サブクラスには-(void)myCustomBackセットアップコードと同様のものがあり、それを繰り返す必要はありません。

于 2013-03-30T18:39:43.287 に答える
2

setup メソッドは、別のクラスにある必要はありません。それを関数にするべきだと思います。

myCustomBackメソッドは、すべてのサブクラスでまったく同じである限り、次のカテゴリに簡単に入れることができますUIViewController

@interface UIViewController (DylanBack)
- (void)DylanCustomBack;
@end

@implementation UIViewController (DylanBack)
- (void)DylanCustomBack
{
    [self.navigationController popViewControllerAnimated:YES];
}
@end

(あなたの名前、または会社やプロジェクトの名前のいずれかから作られた接頭辞にイニシャルを使用してください。それは醜いですが、衝突の可能性を避ける必要があります。カテゴリの衝突はメソッドを破壊し、危険なバグを生成します。)

これを行っている限り、ヘルパー メソッドもカテゴリに入れることができます。これをインスタンス メソッドに変換しself、渡されたコントローラーの代わりに使用します。

次に、すべてのサブクラスがメソッドを継承し、そこで定義したかのように使用できます。いずれかのクラスを特殊化する必要がある場合は、オーバーライドできます。

于 2013-03-30T18:40:05.327 に答える
0

ほとんどの言語では、最も簡単な解決策はUtils、静的 (クラス) メソッドを持つ複数のクラスを持つことです。

Obj-C では、一般的な方法はカテゴリを使用することです。

UIBarButtonItemあなたの例では、たとえばUIBarButtonItem (CustomizedButtons)メソッドを使用してカテゴリを作成する+(UIBarButton*)customBackButton方がはるかに優れています。

ただし、もっと簡単な方法があります。すべての戻るボタンの外観を 1 か所で変更できます。例を見てみましょう

NSDictionary* titleAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [UIFont titilliumBoldWithSize:14.0f], UITextAttributeFont,
                                    [UIColor colorWithIntegerRed:181 green:201 blue:210], UITextAttributeTextColor,
                                    [UIColor clearColor], UITextAttributeTextShadowColor,
                                    [NSValue valueWithUIOffset:UIOffsetMake(1.0f, 1.0f)], UITextAttributeTextShadowOffset,
                                    nil];

NSDictionary* titleAttributesHighlighted = [NSDictionary dictionaryWithObjectsAndKeys:
                                               [UIFont titilliumBoldWithSize:14.0f], UITextAttributeFont,
                                               [UIColor whiteColor], UITextAttributeTextColor,
                                               [UIColor clearColor], UITextAttributeTextShadowColor,
                                               [NSValue valueWithUIOffset:UIOffsetMake(1.0f, 1.0f)], UITextAttributeTextShadowOffset,
                                                nil];

[[UIBarButtonItem appearance] setTitleTextAttributes:titleAttributes forState:UIControlStateNormal];    
[[UIBarButtonItem appearance] setTitleTextAttributes:titleAttributesHighlighted forState:UIControlStateHighlighted];

[[UIBarButtonItem appearance] setTitlePositionAdjustment:UIOffsetMake(0.0f, 1.0f) forBarMetrics:UIBarMetricsDefault];

UIImage* backButtonImage = [UIImage imageNamed:@"navigation_button_back_bg"];
UIImage* backButtonImageHighlighted = [UIImage imageNamed:@"navigation_button_back_bg_highlighted"];

UIEdgeInsets backButtonCapInsets;
backButtonCapInsets.top = 0.0f;
backButtonCapInsets.bottom = backButtonImage.size.height;
backButtonCapInsets.left = 14.0f;
backButtonCapInsets.right = 5.0f;

backButtonImage = [backButtonImage resizableImageWithCapInsets:backButtonCapInsets];
backButtonImageHighlighted = [backButtonImageHighlighted resizableImageWithCapInsets:backButtonCapInsets];    

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage
                                                  forState:UIControlStateNormal
                                                barMetrics:UIBarMetricsDefault];

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImageHighlighted
                                                  forState:UIControlStateHighlighted
                                                barMetrics:UIBarMetricsDefault];

カスタム ビューを使用する必要はなく、特別な戻るボタン セレクターも使用しないことに注意してください。

于 2013-03-30T18:57:08.963 に答える