2012-04-01 14 views
21

Ich muss eine TextField zu einer UIAlertView hinzufügen. Ich verstehe, dass Apple diesen Ansatz abhält. Gibt es also eine Bibliothek, die ich verwenden könnte, um eine TextField zu einem UIAlertView Look-Alike-Frame hinzuzufügen?Hinzufügen von TextField zu UIAlertView

Antwort

4

versuchen, etwas wie folgt aus:

UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Title" 
               message:@"\n\n" 
               delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"Save", nil] autorelease]; 
CGRect rect = {12, 60, 260, 25}; 
UITextField *dirField = [[[UITextField alloc] initWithFrame:rect] autorelease]; 
dirField.backgroundColor = [UIColor whiteColor]; 
[dirField becomeFirstResponder]; 
[alert addSubview:dirField]; 

[alert show]; 
+2

Ich denke, Apple entmutigen Ihre Ansatz. – shajem

3

können Sie versuchen:

UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Your title here!" message:@"this gets covered" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]; 
UITextField *myTextField = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 45.0, 260.0, 25.0)]; 
[myTextField setBackgroundColor:[UIColor whiteColor]]; 
[myAlertView addSubview:testTextField]; 
[myAlertView show]; 
[myAlertView release]; 

dieses link Folgen für das Detail.

+0

Ja, Ihr Code funktioniert. Aber Apple rät davon ab, private APIs zu verwenden. SO kann ich das anders lösen? – shajem

+0

Hier wird keine private API verwendet. –

+0

@anonymous Das OP verweist auf diesen Satz aus der Dokumentation: Die Ansichtshierarchie für diese Klasse ist privat und darf nicht geändert werden. –

0

beziehen Sie sich darauf ... http://iosdevelopertips.com/undocumented/alert-with-textfields.htmlDies ist private API und wenn Sie es für App in Appstore verwenden, kann es abgelehnt werden, aber es ist in Ordnung für die Unternehmensentwicklung.

+0

Vielen Dank für Ihre Antwort, aber ich hoffe, meine App in Appstore zu veröffentlichen: S – shajem

+0

als ich nicht rate, sollten Sie dies implementieren. –

6

Ich benutze BlockAlertsAndActionSheets anstelle der Apple-Komponenten für AlertViews und ActionSheets, wie ich die Blöcke-Ansatz bevorzugen. Enthält auch eine BlockTextPromptAlertView in der Quelle, die Sie möglicherweise möchten. Sie können die Bilder dieses Steuerelements ersetzen, um den Apple-Stil wiederherzustellen.

Project on gitgub

Tutorial which gets you started

Beispiel:

- (IBAction)newFolder:(id)sender { 
    id selfDelegate = self; 
    UITextField     *textField; 
    BlockTextPromptAlertView *alert = [BlockTextPromptAlertView promptWithTitle :@"New Folder" 
                    message   :@"Please enter the name of the new folder!" 
                    textField  :&textField]; 
    [alert setCancelButtonWithTitle:@"Cancel" block:nil]; 
    [alert addButtonWithTitle:@"Okay" block:^{ 
     [selfDelegate createFolder:textField.text]; 
    }]; 
    [alert show]; 
} 

- (void)createFolder:(NSString*)folderName { 
    // do stuff 
} 
+0

Können Sie mir ein Beispiel zeigen, das 'BlockTextPromptAlertView' verwendet. Ich habe den Eindruck, dass Entwickler keine Textfelder usw. zu UIAlertView hinzufügen dürfen. – shajem

+0

Sie haben Recht mit Ihrem Eindruck. Das ist der Grund, warum BlockAlertsAndActionSheets ** UIAlertView überhaupt nicht verwendet, es ist eine vollständig unabhängige Implementierung, ohne dass private APIs verwendet werden. Ich habe momentan keinen Zugriff auf meine Quellen, kann aber meine Antwort in einigen Stunden mit einem Codebeispiel aktualisieren. –

+0

aktualisiert mit Beispielverwendung –

14

Leider ist die einzige offizielle API dafür ist, iOS 5 und höher, es ist eine Eigenschaft alertViewStyle genannt, die auf die folgenden Parameter eingestellt werden:

UIAlertViewStyleDefault 
UIAlertViewStyleSecureTextInput 
UIAlertViewStylePlainTextInput 
UIAlertViewStyleLoginAndPasswordInput 

UIAlertViewStylePlainTextInput ist derjenige, den Sie wollen.

Es wird von Apple dringend abgeraten, sich mit der oben beschriebenen Ansichtshierarchie zu messen.

+0

Ich muss dies für iOS 4 und 5 erstellen. Sie sind sich dessen bewusst jede andere Bibliothek, wo ich verwenden könnte – shajem

69

Für iOS5:

UIAlertView *av = [[UIAlertView alloc]initWithTitle:@"Title" message:@"Please enter someth" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]; 
av.alertViewStyle = UIAlertViewStylePlainTextInput; 
[av textFieldAtIndex:0].delegate = self; 
[av show]; 

Auch können benötigen UITextFieldDelegate, UIAlertViewDelegate Protokolle zu implementieren.

0

Hinzufügen von 'Shmidt' zu beantworten, wird der Code Text in UIAlertView eingegeben zu erfassen ist unten eingefügt (Danke 'Wayne Hartman' Getting text from UIAlertView)

für
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (buttonIndex == 1) { 
     self.userNumber = [alertView textFieldAtIndex:0].text; 
     if (self.userNumber) { 
      // user enetered value 
      NSLog(@"self.userNumber: %@",self.userNumber); 
     } else { 
      NSLog(@"null"); 
     } 

    } 
} 
4

Ab iOS 8 UIAlertView ist veraltet UIAlertController, die UITextField s für das Hinzufügen unter Verwendung des Verfahrens Unterstützung ergänzt:

- (void)addTextFieldWithConfigurationHandler:(void (^)(UITextField *textField))configurationHandler; 

this answer für ein Beispiel.

1

Zuallererst Hinzufügen von UIAlertViewDelegate zu ViewController.h Datei wie

#import <UIKit/UIKit.h> 

@interface UIViewController : UITableViewController<UIAlertViewDelegate> 

@end 

und als Add Below-Code, wo Sie wollen Anzeige aufmerksam zu machen,

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" 
              message:@"Message" 
              delegate:self 
            cancelButtonTitle:@"Done" 
            otherButtonTitles:nil]; 
alert.alertViewStyle = UIAlertViewStylePlainTextInput; 
[alert show]; 

und Delegierter Methode, die, was Eingabe von UITextField gibt

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
NSLog(@"%@", [alertView textFieldAtIndex:0].text); 
} 
Verwandte Themen