サブクラス化せずに、カテゴリを作成することでこれを行うことができます (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
。
UIBarbuttonItem
initWithFrame
バー (UINavigationBar
またはUIToolbar
) を構成するもの (この場合はナビゲーション コントローラー) が最終的なサイズと配置を担当するため、はありません。viewController は、barButtonItems の相対的な順序、およびそれらが左または右に表示されるかどうか、およびコンテンツとその外観 (のいくつかの側面) を管理しますが、残りは NavController 次第です。