2012-05-26 11 views
9

I have UITableViewController. In questo controller aggiungo una sottoview UIView con UITextField in esso. Quando l'UITextField ottenere prima responder haimpostazione della prima vista responder della tabella ma non conosciamo il suo tipo (cell/header/footer)

impostando la prima vista risponditore del tavolo, ma non sappiamo il suo tipo (cellule/intestazione/piè di pagina)

Codice, come di seguito:

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

Come evitare questo avviso?

+0

Puoi mostrarci dove dichiari 'albumNameField'? – Barjavel

+0

@Barjavel aggiornato –

+0

Ho provato a dichiarare in '@interface UserAlbumListViewController: UITableViewController {}' ha lo stesso avviso –

risposta

18

L'avviso indica che è stato aggiunto opaqueView direttamente alla vista tabella. Le visualizzazioni delle tabelle prevedono l'aggiunta di subview interattive a tableHeaderView, tableFooterView o all'interno di una cella.

La riga di errore è [self.view addSubview:opaqueView]; perché self.view è la vista tabella.

È possibile risolvere questo è uno dei diversi modi. Se si utilizza un controller di navigazione, è possibile inviare un nuovo controller con opaqueView al suo interno. È possibile visualizzare una vista modale sulla vista tabella con opaqueView al suo interno. È possibile modificare la struttura in modo tale che self.view non sia una vista tabella (che è molto lavoro).


UPDATE

Questa risposta è una specie di occupato, quindi mi post un aggiornamento. Ho scoperto che Apple utilizza una soluzione diversa da quelle che ho suggerito.

Invece di [self.view addSubview:opaqueView]; che tenta di aggiungere la vista secondaria a una vista tabella, è possibile eseguire [self.view.window addSubview:opaqueView]; che aggiunge la visualizzazione secondaria direttamente alla finestra della vista tabella. È necessario tenere presente che si sta utilizzando una vista in modo che i limiti e la cornice possano essere diversi da self.view.

+0

questo può diventare il motivo di crash sarà bello se qualcuno risponda a questa ... con un anticipo in anticipo – user968597

+0

C'è un modo che posso nascondere questo messaggio di avviso? –

+0

Non che io sappia. L'unica soluzione è non chiamare '- [UITableView addSubview:]' –

1

Ho ottenuto questo errore "(cella/intestazione/piè di pagina)" quando una vista inviata a NavigationController era un'istanza di UITableView invece di UIView. Quindi, nell'editor Xib della classe, ho aggiunto una vista alla tela, quindi il testo è stato infine aggiunto alla vista attraverso un paio di altre viste in basso. UI Builder ti consente di specificare UITableView come superclasse della vista e di posizionare una vista sull'area di disegno, anche se l'aggiunta di elementi a questa vista ha causato il messaggio "impostazione della prima vista responder della tabella ma non conosciamo il suo tipo (cellule/intestazione/piè di pagina)".

+0

E il tuo punto è ...? –

+0

... altre persone alla ricerca di modi per risolvere il messaggio potrebbero trovare utile questa risposta. –

Problemi correlati