设置表的第一个响应者视图但我们不知道它的类型(单元格/页眉/页脚)

Jas*_*hao 9 iphone objective-c ios

我有UITableViewController.在这个控制器中,我添加了一个UITextField的子视图UIView.当UITextField获得第一响应者时

设置表的第一个响应者视图但我们不知道它的类型(单元格/页眉/页脚)

代码如下:

@interface UserAlbumListViewController (){
    NSString *newAlbumName;
    UITextField *albumNameField;
}

@end

-(void)addAlbumButtonPressed:(id)sender{
self.tableView.scrollEnabled = NO;
CGRect frame = self.view.frame;
UIView *opaqueView = [[UIView alloc] initWithFrame:frame];
opaqueView.tag = 1001;
opaqueView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5];


UIView *controllerView = [[UIView alloc] init];
controllerView.tag = 1002;
controllerView.backgroundColor = [UIColor whiteColor];
controllerView.frame = CGRectMake(10.0f, 60.0f, frame.size.width - 20.0f, 90.0f);
[opaqueView addSubview:controllerView];

albumNameField = [[UITextField alloc] init];
albumNameField.borderStyle = UITextBorderStyleRoundedRect; 
albumNameField.placeholder = NSLocalizedString(@"Album Name",nil);
albumNameField.keyboardType = UIKeyboardTypeDefault;
albumNameField.returnKeyType = UIReturnKeyDefault;
albumNameField.autocorrectionType = UITextAutocorrectionTypeNo;
albumNameField.autocapitalizationType = UITextAutocapitalizationTypeNone;
albumNameField.clearButtonMode = UITextFieldViewModeWhileEditing;
albumNameField.clearsOnBeginEditing = NO;
albumNameField.text = @"";
albumNameField.frame = CGRectMake(10.0f , 10.0f, controllerView.frame.size.width - 20.0f, 30.0f);
[albumNameField becomeFirstResponder];
[controllerView addSubview:albumNameField];


UIButton *_cancelButton =  [UIButton buttonWithType:UIButtonTypeRoundedRect];
_cancelButton.backgroundColor = [UIColor clearColor];
[_cancelButton setTitle:NSLocalizedString(@"Cancel",nil) forState:UIControlStateNormal];
_cancelButton.frame = CGRectMake( controllerView.frame.size.width - 90.0f,  albumNameField.frame.origin.y + albumNameField.frame.size.height + 10.0f, 80.0f, 30.0f);

[_cancelButton addTarget:self action:@selector(opaqueViewCancelButtonClicked:) forControlEvents:UIControlEventTouchDown];
[controllerView addSubview:_cancelButton];

UIButton *_OKButton =  [UIButton buttonWithType:UIButtonTypeRoundedRect];
_OKButton.backgroundColor = [UIColor clearColor];
[_OKButton setTitle:NSLocalizedString(@"OK",nil) forState:UIControlStateNormal];
_OKButton.frame = CGRectMake( _cancelButton.frame.origin.x - 90.f, _cancelButton.frame.origin.y, 80.0f, 30.0f);
[_OKButton addTarget:self action:@selector(opaqueViewOKButtonClicked:) forControlEvents:UIControlEventTouchDown];
[controllerView addSubview:_OKButton];

[self.view addSubview:opaqueView];

[controllerView release];
[opaqueView release];
}
Run Code Online (Sandbox Code Playgroud)

如何避免这种警告?

Jef*_*mas 18

警告告诉您已将opaqueView直接添加到表视图中.表视图期望将交互式子视图添加到tableHeaderView,tableFooterView或单元格内.

违规行是[self.view addSubview:opaqueView];因为self.view是表格视图.

你可以解决这个问题之一.如果您使用的是导航控制器,则可以在其中推送一个带有opaqueView的新控制器.您可以在表视图中弹出一个模态视图,其中包含opaqueView.您可以更改结构,使self.view不是表视图(这是很多工作).


UPDATE

这个答案有点忙,所以我会发布更新.我发现Apple使用的是与我建议的解决方案不同的解决方案.

[self.view addSubview:opaqueView];您可以[self.view.window addSubview:opaqueView];将子视图直接添加到表视图的窗口,而不是尝试将子视图添加到表视图.您需要记住,您正在使用视图,因此边界和框架可能不同self.view.