1

XcodeとObjectivecは初めてです。特定の外観のボタン(おそらくナビゲーションバーのUIBarButtonItem)を作成したいのですが、これをさまざまなビューで繰り返し使用します。長い間検索しましたが、方法がわかりません。

UIBarButtonItemをサブクラス化するのは適切でしょうか?私はそれをやろうとしましたが、すぐに頭がおかしくなりました。UIBarButtonItemのサブクラスとして.hファイルと.mファイルを作成したら、UIBarButtonItemをインスタンス化する必要がありますか?これらのファイルは、(親クラスからインポートされた)ボタンオブジェクトを自動的に作成しませんか?これは、自分自身と呼ぶことができますか?独自のサブクラス内でボタンをインスタンス化するのは奇妙に思えます。

私がやりたいことの1つは、行を追加することです。

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

しかし、そのプロパティを使用して再利用可能なボタンを作成する方法については迷っています。

それが再利用可能なカスタムボタンを作成するための完全に間違ったアプローチであるとしても、私は明らかにオブジェクトの理解を向上させる必要があるので、私の誤解の説明をいただければ幸いです。

お願いします?

4

1 に答える 1

9

サブクラス化せずに、カテゴリを作成することでこれを行うことができます (Objective-C で推奨される方法)。カテゴリを使用すると、オブジェクトをサブクラス化することなく、オブジェクトのカスタム メソッドを提供できます。カスタムプロパティを(簡単に)提供することはできませんが、あなたの場合、これは関係ありません

カテゴリの使用

カテゴリ ヘッダー ファイルは次のようになります。

//  UIButton+StyledButton.h

#import <UIKit/UIKit.h>

@interface UIButton (StyledButton)
- (void) styleButton; 
@end

次に、実装ファイルで:

//
//  UIButton+StyledButton.m
//

#import "UIButton+StyledButton.h"

@implementation UIButton (StyledButton)

- (void) styleButton {
    //style your button properties here
    self.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
}

('self' は、カテゴリに記述したカスタム メソッドも取得するボタン オブジェクトを指します。)

それを使用するには、#import "UIButton+StyledButton.h"次のようなことができます...

on viewDidLoad {
    [super viewDidLoad];
    UIButton* myButton = [[UIButton alloc] initWithFrame:myFrame];
    [myButton styleButton];
}

サブクラスの使用

サブクラス化された同等のものは次のようになります。

ヘッダファイルは...

//  MyCustomButton.h

#import <UIKit/UIKit.h>

@interface MyCustomButton : UIButton
- (id)initWithCoder:(NSCoder *)coder;
- (id)initWithFrame:(CGRect)frame;
@end

実装ファイル...

//  MyCustomButton.m

#import "MyCustomButton.h"

@implementation MyCustomButton

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self styleButton];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        [self styleButton];
    }
    return self;
}

- (void) styleButton {
    //style your button properties here
    self.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
}

2 つの init メソッドを提供initWithFrameします。これは、コードでオブジェクトを割り当て/初期化するときに呼び出すメソッドです。initWithCoderストーリーボードまたは xib からオブジェクトをロードする場合に、システムによって呼び出される init メソッドです。

コードでカスタム ボタンの 1 つを作成するには、他のオブジェクトと同じように割り当て/初期化します。

MyCustomButton* button = [[MyCustomButton alloc] initWithFrame:buttonFrame];

スーパークラス インスタンスの割り当て/初期化も行わないでください。これはinitWithFrame:、サブクラスのメソッドが[super initWithFrame:frame]. selfカスタム サブクラス インスタンスを参照しますが、サブクラスにオーバーライドを実装していない限り、そのスーパークラスのすべての (パブリック) プロパティとメソッドが含まれます。

ストーリーボード/xib でサブクラス化されたボタンを使用するには、通常のボタンをドラッグして、Identity Inspector でそのタイプをカスタム ボタン クラスに設定します。このinitWithCoderメソッドは、ボタンがストーリーボード/xib からビューに読み込まれるときに自動的に呼び出されます。

アップデート

あなたのコメントから、あなたはまだいくつかの混乱を抱えているようです.

自分が何をしているのか本当によくわかっていない限り、UINavigationController のサブクラス化は避けてください。必要になることはめったにありません。

navController のインターフェイスのボタンは、含まれている viewController のプロパティです。のnavigationItemプロパティを調べますUIViewController(同様に - の場合UIToolbar、View Controller にはtoolbarItemsプロパティがあります)。これにより、Navigation Controller をコンテキストに対応させることができます。

私の例の「viewDidLoad」は、通常のUIViewController. 私の例も、と正式な関係のないレギュラーUIBUttonのカテゴリです。UIBarButtonItem

UIBarButtonItem(から継承しない) を試す前に、最初に通常の ViewController で動作するように UIButton カテゴリを取得してみてくださいUIButton

UIBarbuttonIteminitWithFrameバー (UINavigationBarまたはUIToolbar) を構成するもの (この場合はナビゲーション コントローラー) が最終的なサイズと配置を担当するため、はありません。viewController は、barButtonItems の相対的な順序、およびそれらが左または右に表示されるかどうか、およびコンテンツとその外観 (のいくつかの側面) を管理しますが、残りは NavController 次第です。

于 2013-03-16T21:51:25.407 に答える