3

コンポーネントの既存のクラスからいくつかのプロパティを制限したいと考えています。

これがサンプルコードです。

UIButton *customBtn;
property (nonatomic, strong) UIButton *customBtn;
@synthesize customBtn;

これは私の実装であり、

customBtn= [UIButton buttonWithType:UIButtonTypeCustom];
 customBtn= setImage:[UIImage imageNamed"radio_button_noraml.png"] forState:UIControlStateNormal];
 customBtn= setImage:[UIImage imageNamed"radio_button_acitve.png"] forState:UIControlStateSelected];
 customBtn = CGRectMake(5, 30, 20, 20); notsupport = [[UILabel alloc]initWithFrame:CGRectMake(25, 30, 290, 20)];
 [customBtn addTargetelf actionselector(MyAction:) forControlEvents:UIControlEventTouchUpInside];
 [self.view addSubview:customBtn];

ビュー コントローラーでは、customBtn を使用して UIbutton のすべてのプロパティにアクセスできました。

myClass.customBtn.backGroundcolor = [UIColor blackColor];

しかし、ボタンのプロパティへのアクセスを制限したいのですが、たとえば、プロパティの背景色とアルファ値にアクセスしたいのですが、残りのプロパティにはアクセスしたくありません。

だから私を助けてください。

ありがとう!

4

4 に答える 4

0

コントローラのヘッダーファイルでプロパティを宣言せcustomBtnず、代わりに、公開するボタンプロパティのプロパティのみを宣言します。たとえば、MyController.h

@interface MyController : UIViewController
{
}

@property(nonatomic, copy) UIColor* customBtnBackgroundColor;

@end

元のクラスのプロパティ宣言にあるのと同じプロパティ属性を使用することに注意してください。この例では、ボタンのbackgroundColorプロパティは実際にはUIView(ではなくUIButton)によって宣言されているため、調べると、プロパティが属性と。UIView.hで宣言されていることがわかります。nonatomiccopy

customBtn次に、コントローラーの実装ファイルでプロパティを非公開で宣言する必要があります。また、ヘッダーファイルで公開したプロパティのgetter/setterメソッドの実装を提供する必要があります。getter / setterメソッドは、呼び出しを実際のボタンオブジェクトに転送するだけです。たとえば、MyController.m

#import "MyController.h"

// Class extension with private methods and properties for MyController
@interface MyController()
  property (nonatomic, strong) UIButton* customBtn;
@end


@implementation MyController

  @synthesize customBtn;

  // Note: No need to synthesize customBtnBackgroundColor here because
  // you don't need an instance variable, and you are providing the
  // getter/setter implementation yourself.


  - (UIColor*) customBtnBackgroundColor
  {
    return self.customBtn.backgroundColor;
  }

  - (void) setCustomBtnBackgroundColor:(UIColor*)backgroundColor
  {
    self.customBtn.backgroundColor = backgroundColor;
  }

@end

他の人が書いているように、外部の誰かがMyControllerプロパティが存在することを知っている場合customBtnでも、プロパティにアクセスできます。ただし、ポイントはのパブリックインターフェイスを定義することでありMyController、上記のソリューションを使用して、期待できる限りのことを実行しました。

于 2012-12-27T13:50:55.933 に答える
0

これは、プライベート、プロテクト、パブリックの継承モードを C++ と比較すると、obj-c に欠けているものの 1 つです。

これらの機能がここにあれば、作業は完了ですが、そうではありません。

Objective C には、プライベートもパブリックもありません。すべてが公開されています。クラスインターフェイスにメソッドを表示することは事実上できませんが、メソッドが存在することを知っている人はアクセスできます。別のクラスから継承するクラスは、すべての「スーパー」クラスのメソッド/属性と独自のメソッド/属性の合計です (Objective-C では、パブリック モードを使用して、1 つのクラスからのみ派生できます)。

于 2012-12-27T13:17:00.593 に答える
0

カスタムコンポーネントが必要で、目的のゲッターをオーバーライドしているようです。実現する他の方法はわかりません。おそらく他の人があなたに与えるでしょう。

したがって、単純な @synthesize にはなりません。

@synthesize に相当するコード:

// .h
@property (nonatomic, retain) id ivar;

// .m
- (id)ivar {
    return ivar;
}

- (void)setIvar:(id)newValue {
    if (ivar != newValue) {  // this check is mandatory
        [ivar release];
        ivar = [newValue retain];
    }
}

現在 - (id)ivar にはいくつかの制限があります。

于 2012-12-27T12:51:38.070 に答える