Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

setting the first responder view of the table but we don't know its type (cell/header/footer)

I have UITableViewController. In this controller I add a subview UIView with UITextField in it. When the UITextField get first responder got

setting the first responder view of the table but we don't know its type (cell/header/footer)

Code as below:

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

How to avoid this warning?

like image 593
Jason Zhao Avatar asked May 26 '12 08:05

Jason Zhao


Video Answer


1 Answers

The warning is telling you that you added opaqueView to the table view directly. Table views expect interactive subviews to be added to tableHeaderView, tableFooterView, or within a cell.

The offending line is [self.view addSubview:opaqueView]; because self.view is the table view.

You can fix this is one of several ways. If you are using a navigation controller, you can push a new controller with opaqueView in it. You can pop up a modal view over the table view with opaqueView in it. You can change the structure such that self.view is not a table view (which is a lot of work).


UPDATE

This answer is kind of busy, so I will post an update. I discovered that Apple uses a different solution then the ones I suggested.

Instead of [self.view addSubview:opaqueView]; which tries to add the subview to a table view, you can do [self.view.window addSubview:opaqueView]; which adds the subview directly to the table view's window. You need to keep in mind that you are using a view so the bounds and frame may be different than self.view.

like image 100
Jeffery Thomas Avatar answered Oct 06 '22 00:10

Jeffery Thomas