0

プロジェクトの簡単なデモをモックアップしていますが、UITextField に問題があります。

私たちが望む動作は、ユーザーがボタンをクリックしたときに、メイン ビューをオーバーレイするカスタム ビューに UITextField と UIButton と共に表示されるカスタム ビューが存在することです。

Searchview.m に Searchview と次のカスタム ビューがあります。問題は、textField がプロパティの場合は表示されませんが、ローカル変数の場合は表示されることです。UITextField が表示されるように、何が起こっているのか誰でも助けてもらえますか? 私がこれをどのように行っているかは正しい考えですか (カスタム UIView またはカスタム UIControl またはモーダルコントローラー)? 最後に、setNeedsDisplay はここで適切でしょうか?

thx事前に

@interface Searchview()
  @property (nonatomic, weak) UITextField *textField;
@end


- (void)drawRect:(CGRect)rect
{
  // this doesn't work
  self.textField = [[UITextField alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 120.0f, 25.0f)];
  self.textField.returnKeyType = UIReturnKeyDone;
  self.textField.placeholder = @"Writer";
  self.textField.borderStyle=UITextBorderStyleBezel;
  [self.textField addTarget:self
                    action:@selector(textFieldDone:) 
          forControlEvents:UIControlEventEditingDidEndOnExit];     
  [self addSubview: self.textField];

/* this works
  UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(10.0f, 10.0f, 120, 25)];
  textField.returnKeyType = UIReturnKeyDone;
  textField.placeholder = @"Writer";
  textField.borderStyle=UITextBorderStyleBezel;
  [textField addTarget:self
                    action:@selector(textFieldDone:) 
          forControlEvents:UIControlEventEditingDidEndOnExit];    

  [self addSubview: textField];
*/

  UIButton *mButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];
  mButton.frame=CGRectMake(200.0f,10.0f,100.0f,37.0f);
  [mButton setTitle:@"search" forState:UIControlStateNormal];
  [mButton addTarget:self action:@selector(showSearchController:) forControlEvents:UIControlEventTouchUpInside];
  [self addSubview:mButton];
  [self setNeedsDisplay];

}

プロパティとして - 非表示: プロパティとして:

ローカル変数として - 表示: ローカル変数

4

2 に答える 2

1
@property (nonatomic, strong) UITextField *textField;

を変更しweakstrongを変更しself.textFiled_textField試してみてください

そして、 textField プロパティが解放されていないことを確認してください

于 2013-02-22T02:50:04.970 に答える
0

考えてみればとても簡単です。ARC は (おおよそ) 次のコードを変換します。

self.weakProp = [[Foo alloc] init];

次の「手動で参照カウントされた」コードに相当します。

Foo * temp = [[Foo alloc] init];
self.weakProp = temp;
[temp release];

それを保持するものは何もないので、解放されます。

assign/weak IBOutlets を使用する理由は 2 つしか考えられません。

  • VC のアウトレットの場合、そのビューが nil に設定されている場合 (たとえば、メモリ警告)、サブビューは保持されません。ビューはメモリ警告で自動的に解放されないため、これは iOS 6.0 ではあまり重要ではありません (そうすれば、それらをすべて明示的に解放できます)。
  • アウトレットがスーパービューを指しているビューの場合 (保持サイクルが発生する可能性があります)。これは非常にまれです。

一般的に、私は IBOutlets を好みstrongます。IBOutlets は、オブジェクトを必要以上に長く存続させる可能性がありますが、より安全でassign効率的ですweak。保持サイクルに気をつけてください!

于 2013-02-22T04:33:32.900 に答える