2

アプリ全体で再利用するため、UIToolbar をサブクラス化しています。UIToolbar はデリゲート プロトコルを使用します。

//
// UIToolbarCustom.h
//

#import <UIKit/UIKit.h>

@protocol UIToolbarCustomDelegate

@required
- (void)tab:(UIBarButtonItem *)sender;
- (void)ok:(UIBarButtonItem *)sender;

@end

@interface UIToolbarCustom : UIToolbar {

    id <UIToolbarCustomDelegate> delegate;

}

@property (strong, nonatomic) id delegate;

@end

スタンドフォード iOS 開発コースの教師は、次のように、アンダースコアを前に付けてすべての ivar を明示的に宣言することを推奨しています。

@implementation UIToolbarCustom

@synthesize delegate = _delegate;

@end

しかし、この特定のシナリオでは、エラーが発生します。

error: property 'delegate' attempting to use ivar '_delegate'...

以下を使用すると、コードは問題なく動作します。

 @synthesize delegate = __delegate; or
 @synthesize delegate;

ここで何が起こっているのですか?_delegate という名前の UIToolbar クラスにプライベート インスタンス変数はありますか?

アップデート

すべての説明とヒントをありがとう、私は多くを学んでいます。私はiOS開発が初めてであることがわかりました(これは私の最初のアプリの2番目のバージョンなので、正しくやろうとしています= p)。ヒントに従って、この新しいヘッダー ファイルを作成しました。

//
// Toolbar.h
//

#import <UIKit/UIKit.h>

@protocol ToolbarDelegate

@required
- (void)tab:(UIBarButtonItem *)sender;
- (void)ok:(UIBarButtonItem *)sender;

@end

@interface Toolbar : UIToolbar

@property (strong, nonatomic) id delegate;

@end

ノート:

  1. クラス接頭辞が削除されました。

  2. デリゲート宣言が削除されました (私は iOS デリゲート チュートリアル コードを使用していますが、コード サンプルでは宣言が必要な古い xcode バージョンを使用しています)。

  3. 合成が削除されました。また、プロパティを合成する必要がなくなったことも知りませんでした。

PS: ivar の問題のため、明らかにコードは機能しません。名前を変更するつもりなので、合成する必要はありません。とにかく、どの名前を使用するかはわかりません...

4

2 に答える 2

5

ここで何が起こっているのですか?_delegate という名前の UIToolbar クラスにプライベート インスタンス変数はありますか?

はい、まさにそれが問題です。インスタンス変数に別の名前を付ける必要があります。__delegateまたは、名前の前に 3 文字のプレフィックスを付けることもできます (最後の段落を参照)。

ivar を として宣言してdelegateから、synthesize ステートメントでコンパイラに を使用するように指示したことに注意してください_delegate。つまり、delegateivar がまったく使用されていないことを意味します。いずれにせよ、(32 ビット Mac ではなく) iOS 向けに作成している場合は、サブクラスの @interface セクションでインスタンス変数を明示的に宣言する必要はありません。あなた。

最後に、UI プレフィックスは UIKit の一部であるクラス用に予約されているため、独自のサブクラスに「UI」で始まる名前を付けることは不適切です。代わりに独自の 3 文字のプレフィックスを使用するか、プレフィックスをまったく使用しないでください。問題は、UIKit の将来のバージョンに「UIToolbarCustom」というクラスが含まれる可能性があり、サブクラスがそれと衝突する可能性があることです。

于 2013-01-07T21:51:05.480 に答える
1

昨年、Xcode 4.3 がリリースされて以来、プロパティを合成する必要はありません。これはコンパイラによって自動的に行われます (ivar が生成され、その名前に先頭のアンダースコアが追加されます)。つまり、ivar を宣言する必要もありません。その場合は、必ず 以外の名前を付けてください_delegate

したがって、本当に必要なのは次の行だけです。

@property (strong, nonatomic) id<UIToolbarCustomDelegate> delegate;

更新:全文については、 Andrew Madsen の回答を参照してください。UIToolbar には という名前の独自の ivar があることがわかりまし_delegateた。誰かわかったね!

于 2013-01-07T21:51:23.750 に答える