Nachdem die Anwendung jetzt eine Datenbank auf dem Gerät mit ihrem Schema initialisiert hat, kann mit dem Hinzufügen von Namen zur Datenbank begonnen werden. Dazu verwendet die Anwendung ein neues Dialogfeld mit einem Textfeld.
Damit ein Benutzer neue Namen eingeben kann, erstellen Sie einen Ansichtscontroller:
Im File-Menü wählen Sie New File....
Bei ausgewählter iPhone OS Cocoa Touch Class auf der linken Seite wählen Sie die UIViewController-Unterklasse aus.
Aktivieren Sie die UITableViewController-Unterklassenoption nicht und wählen (aktivieren) Sie die With XIB for user interface-Option.
Klicken Sie auf Weiter.
Nennen Sie die Datei NewNameViewController.m.
Wählen Sie den Names/Classes/-Standort.
Klicken Sie auf Finished.
Damit werden drei Dateien erstellt: NewNameViewController-Header und Implementierungsdatei sowie eine XIB-Datei, die im Interface Builder bearbeitet werden kann. Um alle XIB-Datei zu gruppieren, können Sie sie in den Resources-Ordner verschieben, in dem zwei XIB-Dateien bereits vorhanden sind (die XIB-Dateien von MainWindow und RootViewController).
Bevor Sie die XIB-Datei um das Textfeld erweitern, müssen Sie erst eine Outlet-Eigenschaft dem Header hinzufügen, damit Sie das Textfeld aus der XIB-Datei in den Programmcode und eine Aktion zur Durchführung einbinden können, wenn der Benutzer die Eingabe des Namens abgeschlossen hat.
@interface NewNameViewController : UIViewController { UITextField *newNameField; } @property (retain) IBOutlet UITextField *newNameField; - (IBAction)doneAdding:(id)sender; @end |
Synthetisieren Sie die Eigenschaft in der Implementierungsdatei und geben Sie das Textfeld in der dealloc-Methode frei. Sie werden die Aktion zu einem späteren Zeitpunkt definieren, sobald das DataAccess-Objekt neue Namen einfügen kann. Einstweilen erstellen Sie einfach einen leeren Methoden-Stub zur Vermeidung von Warnungen bei der Kompilierung.
@synthesize newNameField; - (IBAction)doneAdding:(id)sender {} |
Durch das IBAction-Schlüsselwort weiß der Interface Builder, dass die Methode zum Aufrufen von Ereignissen verfügbar gemacht werden soll. Achten Sie darauf, dass die Header-Datei gespeichert wird, damit der Interface Builder die Methode kennt.
Nachdem die Outlet-Eigenschaft eingerichtet ist, doppelklicken Sie auf die NewNameViewController-XIB-Datei, um sie im Interface Builder zu bearbeiten. Im Interface Builder sehen Sie eine leere Ansicht mit einer Statusleiste, die die Akkuladung anzeigt. Da diese Ansicht auch eine Navigationsleiste anzeigt, simulieren Sie die Anzeige wie folgt:
Im Document Window (Apfel-0) wählen Sie View.
Im Attribute Inspection Window (Apfel-1), unter Simulated Interface Elements legen Sie Top Bar mit Navigation Bar fest.
Die Ansicht muss nun eine leere Navigationsleiste unmittelbar unterhalb der Statusleiste zeigen.
Damit die Benutzer einen neuen Namen eingeben können, fügen Sie der Ansicht ein Textfeld hinzu:
Im Fenster Library (Apfel-Shift-L) unter Inputs & Values klicken Sie auf ein Textfeld und ziehen es in die Ansicht.
Positionieren Sie das Textfeld in die obere Hälfte der Ansicht, damit es nicht von der Tastatur in der unteren Hälfte überdeckt wird.
Erweitern Sie das Textfeld, damit ein Name hineinpasst. Eine Breite von rund 230 Pixel sollte ausreichen. Um die Größen- und Positionierungsoptionen anzuzeigen, verwenden Sie den Size Inspector (Apfel-3) bei ausgewähltem Textfeld.
Damit das Textfeld bedienerfreundlicher wird, können Sie seine Eigenschaften ändern:
Wählen Sie das Textfeld in der Ansicht.
Mit ausgewähltem Textfeld öffnen Sie das Attribute Inspection Window (Apfel-1).
Legen Sie Placeholder mit Name fest.
Legen Sie die Schriftgröße mit 18 Punkt fest.
Legen Sie Capitalize mit Words fest.
Legen Sie Return Key mit Done fest.
Damit der Controller weiß, wann ein Benutzer die Namenseingabe abgeschlossen hat, müssen Sie Aktionsverbindungen im Interface Builder einrichten.
Öffnen Sie den Connections Inspector (Apfel-2).
Klicken und ziehen Sie aus dem Did End on Exit-Ereigniskreis auf File's Owner im Document Window und wählen Sie done Adding, um die Verbindung zu aktivieren. Der File's Owner dieser XIB-Datei ist die NewNameViewController-Klasse, wie der File's Owner-Typ anzeigt. Wenn Ziehen und Ablegen über File's Owner keine Auswahl ergibt, achten Sie darauf, dass der NewNameViewController-Header gespeichert ist und IBOutlet doneAdding enthält.
Damit ein Verweis auf das Textfeld im Programmcode erfolgt, müssen Sie dieses Textfeld mit der IBOutlet-Eigenschaft verbinden, die Sie vorher in der Header-Datei definiert haben.
Wählen Sie File's Owner im Document Window. Öffnen Sie den Connections Inspector (Apfel-2).
Suchen Sie unter Outlets nach newNameField.
Klicken und ziehen Sie aus dem newNameField-Kreis in das tatsächliche Namensfeld in der Ansicht.
Die Ansicht ist damit vollständig. Speichern Sie die XIB-Datei im Interface Builder und kehren Sie zu Xcode zurück.
Um die Ansicht zu beenden, müssen Sie im Code Eigenschaften festlegen. Entfernen Sie die Kommentarzeichen vor der viewDidLoad-Methodenvorlage in der NewNameViewController-Implementierung und fügen Sie den folgenden Code hinzu:
- (void)viewDidLoad { [super viewDidLoad]; // Set the title to display in the nav bar self.title = @"Add Name"; // Set the text field to the first responder to display the keyboard. // Without this the user needs to tap on the text field. [newNameField becomeFirstResponder]; } |
Um den Ansichtscontroller anzuzeigen, den Sie gerade erstellt haben, muss RootViewController konfiguriert werden. Importieren Sie die NewNameViewController- und DataAccess-Header in die Implementierung von RootViewController und fügen Sie die folgende Methodensignatur ihrem Header hinzu:
- (void)showAddNameScreen; |
Implementieren Sie die Methode mit dem folgenden Code:
- (void)showAddNameScreen { NewNameViewController * addNameScreen = [[NewNameViewController alloc] initWithNibName:@"NewNameViewController" bundle:nil]; [self.navigationController pushViewController:addNameScreen animated:YES]; } |
Ähnlich wie beim Festlegen des Titels für NewNameViewController legen Sie den Titel von RootViewController fest und fügen ein Pluszeichen rechts in der Navigationsleiste ein, das showAddNameScreen aufruft.
- (void)viewDidLoad { [super viewDidLoad]; // The Navigation Controller uses this to display the title in the nav bar. self.title = @"Names"; // Little button with the + sign on the right in the nav bar self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(showAddNameScreen)]; } |
Um neue Namen in die Datenbank einzufügen, fügen Sie dem DataAccess-Objekt Funktionen hinzu. Fügen Sie die folgende Methodensignatur dem DataAccess-Header hinzu:
// Adds the given name to the database. - (void)addName:(NSString *)name; |
Zur Durchführung der Einfügung verwendet die Anwendung die folgende SQL-Anweisung:
const char * INSERT = "INSERT INTO Names(name) VALUES(?)"; |
Die addName-Methode kann jetzt implementiert werden:
- (void)addName:(NSString *)name { const char * INSERT = "INSERT INTO Names(name) VALUES(?)"; ULPreparedStatement * prepStmt = connection->PrepareStatement(INSERT); if (prepStmt) { // Convert the NSString to a C-Style string using UTF8 Collation prepStmt->SetParameterString(1, [name UTF8String], [name length]); prepStmt->ExecuteStatement(); prepStmt->Close(); connection->Commit(); } else { NSLog(@"Could not prepare INSERT statement."); } } |
Wenn die addName-Methode abgeschlossen ist, kann die doneAdding-Methode von NewNameViewController implementiert werden:
- (IBAction)doneAdding:(id)sender { if (newNameField.text > 0) { [[DataAccess sharedInstance] addName:newNameField.text]; } [self.navigationController popViewControllerAnimated:YES]; } |
Sie sollten nun den DataAccess-Header importieren. Die Taste done auf der Tastatur fügt jetzt den Namen der Datenbank hinzu und veranlasst die Rückkehr in die Tabellenansicht. Die Tabellenansicht ist jedoch noch nicht darauf konfiguriert, den Datenbankinhalt anzuzeigen.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |