9

我有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];
}

如何避免这个警告?

4

2 回答 2

18

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

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

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


更新

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

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

于 2012-05-26T14:07:04.000 回答
1

当推送到 NavigationController 的视图是 UITableView 而不是 UIView 的实例时,我收到此“(单元格/页眉/页脚)”错误。然后在该类的 Xib 编辑器中,我向画布添加了一个视图,然后最终通过几个视图将文本添加到视图中。UI Builder 将允许您将 UITableView 指定为视图的超类并在画布上放置一个视图,即使将项目添加到此视图会导致消息“设置表的第一响应者视图但我们不知道它的类型(单元格/页眉/页脚)”。

于 2012-05-27T22:20:45.713 回答