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.
Klicken Sie bei gedrückter Control-Taste auf Classes und klicken Sie im Menü Add File auf New File.
Wählen Sie auf der linken Seite die Option iPhone OS Cocoa Touch Class aus und klicken Sie auf die Unterklasse UIViewController.
Klicken Sie nicht auf die Unterklassenoption UITableViewController und klicken Sie auf With XIB for user interface .
Klicken Sie auf Weiter.
Nennen Sie die Datei NewNameViewController.m.
Klicken Sie auf den Speicherort names/Classes/.
Klicken Sie auf Fertig stellen.
Damit werden drei Dateien erstellt: die NewNameViewController-Header-Datei (.h) und die dazugehörige Implementierungsdatei (.m) 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. Fügen Sie der NewNameViewController.h-Datei Folgendes hinzu:
@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 in NewNameViewController.m 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:
Klicken Sie im Fenster Document (Befehl-0) auf View.
Setzen Sie im Fenster Attributes Inspector (Befehl-1) unter Simulated User Interface Elements die Option Top Bar auf Navigation Bar.
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:
Klicken Sie im Fenster Library (Befehl-Umschalt-L) unter Inputs & Values 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 so, dass ein Name hineinpasst. Verwenden Sie eine Breite von ca. 230 Pixel. Um die Größen- und Positionierungsoptionen anzuzeigen, verwenden Sie bei ausgewähltem Textfeld den Size Inspector (Befehl-3).
Damit das Textfeld bedienerfreundlicher wird, können Sie seine Eigenschaften ändern:
Klicken Sie in der Ansicht auf das Textfeld.
Öffnen Sie bei ausgewähltem Textfeld das Fenster Attributes Inspector (Befehl-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 erkennen kann, wann ein Benutzer die Namenseingabe abgeschlossen hat, müssen Sie Aktionsverbindungen im Interface Builder herstellen.
Öffnen Sie bei ausgewähltem Textfeld den Text Field Connections Inspector (Befehl-2).
Klicken und ziehen Sie ein Objekt aus dem Ereigniskreis Did End on Exit in das Fenster Document, auf File's Owner, und klicken Sie auf done Adding, um die Verbindung herzustellen. 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. Der File's Owner dieser XIB-Datei ist die NewNameViewController-Klasse, wie der File's Owner-Typ anzeigt.
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.
Klicken Sie im Fenster Document auf File's Owner. Öffnen Sie den Connections Inspector (Befehl-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 ersetzen Sie sie durch den folgenden Code:
- (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 Header NewNameViewController und DataAccess in die Implementierungsdatei von RootViewController und fügen Sie die folgende Methodensignatur zu deren Header (RootViewController.h) hinzu:
- (void)showAddNameScreen; |
Implementieren Sie die Methode in RootViewController.m mit dem folgenden Code:
- (void)showAddNameScreen { NewNameViewController * addNameScreen = [[NewNameViewController alloc] initWithNibName:@"NewNameViewController" bundle:nil]; [self.navigationController pushViewController:addNameScreen animated:YES]; } |
Legen Sie den Titel für RootViewController ähnlich wie den Titel von NewNameViewController fest und fügen ein Pluszeichen rechts in der Navigationsleiste ein, das showAddNameScreen aufruft. Entfernen Sie die Kommentarzeichen des viewDidLoad-Blocks und ersetzen Sie sie durch den folgenden Code:
- (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; |
Implementieren Sie die addName-Methode in der Implementierungsdatei:
- (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, fügen Sie aus NewNameViewController die doneAdding-Methode zur Implementierungsdatei hinzu. Ersetzen Sie die Methode durch den folgenden Code:
- (IBAction)doneAdding:(id)sender { if (newNameField.text > 0) { [[DataAccess sharedInstance] addName:newNameField.text]; } [self.navigationController popViewControllerAnimated:YES]; } |
Importieren Sie den DataAccess-Header in NewNameViewController.h. Dadurch kann die Schaltfläche Done der Tastatur den Namen der Datenbank hinzufügen und während der Laufzeit zur zurückkehren. Die Tabellenansicht ist jedoch noch nicht darauf konfiguriert, den Datenbankinhalt anzuzeigen. Siehe Lektion 4: Anzeigen der Daten aus der Datenbank.
Zu diesem Zeitpunkt sollten Sie Anwendung erstellen, um zu testen, ob sie ohne Fehler erstellt wird. Klicken Sie im Menü Build auf Build.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |