0

我正在模拟一个项目的快速演示,但遇到了 UITextField 的问题。

我们想要的行为是,当用户单击按钮时,应该有一个自定义视图出现,其中包含一个 UITextField 和一个 UIButton 在覆盖主视图的自定义视图中。

我在 Searchview.m 中有一个名为 Searchview 的自定义视图和以下内容。问题是当 textField 是一个属性时,它不会显示,但是当它是一个局部变量时,它会显示。任何人都可以帮助我了解正在发生的事情,以便 UITextField 显示吗?我是如何做到这一点的甚至是正确的想法(自定义 UIView 或自定义 UIControl 或模态控制器)?最后, setNeedsDisplay 在这里合适吗?

提前谢谢

@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];

没有任何东西保留它,所以它被释放了。

我只能想到分配/弱 IBOutlets 的两个原因:

  • 对于 VC 中的插座,因此当其视图设置为 nil 时(例如在内存警告上),它不会保留子视图。这在 iOS 6.0 中不太相关,因为视图不会在内存警告时自动释放(所以如果你这样做,你可以显式地释放它们)。
  • 对于出口指向超级视图的视图(并会导致保留周期)。这是相当罕见的。

一般来说,我更喜欢strongIBOutlets:它们可能使对象存活的时间比必要的时间长一点,但它们assignweak. 请注意保留周期!

于 2013-02-22T04:33:32.900 回答