0 Allgemeines
0.1 Kursinhalte
0.2 Mac-Installation
0.3 Links
1 C-Sharp-Themen
1.1 Zugriffsmodifizierer
1.2 Bedingter Operator
1.3 Eigenschaften/Properties
1.4 Referenzen
2 Einführung
3 Grundlagen+Controls
3.1 Constraints
3.2 Controls
3.3 nint und nfloat
4 Listen
4.1 Indizierte Listen
5 Dynamisch erzeugte Controls
6 Touch+Gesten
7 Systeminfos
8 Dateien
9 Datenbanken
10 Seiten
11 Lebenszyklus
11.1 Lebenszyklus von Seiten
11.2 Lebenszyklus von Apps
12 Graphiken
13 Kamera+Galerie
14 Webzugriffe
15 Sensoren
16 Kontakte
InhaltsverzeichnisMontag, 28. August 2017 10:29
Seite 2
KursinhalteFreitag, 25. August 201712:23
Einführung (ca. 3 Tage)
Einführung in die iPhone-App-Entwicklung Xamarin
und in die Simulator-Struktur eines Xamarin-Programms.
Die erste App Steuerung (Touch)
Layout und Design (ca. 4 Tage)
Controller und Views
Storyboard
Optische Darstellung von Seiten
Verwendung von xib-Templates
Controls und ihre Ereignisse
Animierte Darstellung
Interaktivität (ca. 3 Tage)
Touchevents und Gesten
Tastaturen
Zugriff auf Galerie und Kamera
Versenden von SMS und E-Mails
Einleiten von Telefonaten
Datenspeicherung (ca. 2 Tage)
Schreiben und Lesen von Dateien
Erstellung und Nutzung von SQLite-Datenbanken
Medien und Konnektivität (ca. 3 Tage)
Auslesen von Sensoren
Zugriff auf Kontakte
Audio- und Video-Wiedergabe
Zeichnen von Graphiken
Web-Requests
Sonntag, 3. September 2017 15:18
Seite 3
Einfach dieser Anleitung folgen:https://techsviewer.com/install-macos-sierra-virtualbox-windows/
Es muss ein Intel-Prozessor der i-Generation vorliegen (i3, i5, …) vorliegen!
Im Anschluss wird auf dem Mac Visual Studio für Mac installiert, der Xamarin mitbringt :-)
Mac-InstallationSonntag, 3. September 2017 15:20
Seite 4
Pseudo-Platzhalter-Text:http://www.loremipsum.de/
Platzhalter-Bilder:http://lorempixel.com/
Icons:https://www.iconfinder.com/
SQLite-Datenbank:http://sqlite.org
LinksSonntag, 3. September 2017 15:22
Seite 5
internal
Auf den Typ oder Member kann von jedem Code in der gleichen Assembly zugegriffen werden, jedoch nicht von Code in einer anderen Assembly.
public
Auf den Typ oder Member kann von jedem Code in der gleichen Assembly oder einer anderen Assembly, die darauf verweist, zugegriffen werden.
private
Auf den Typ oder Member kann nur von Code in der gleichen Klasse oder Struktur zugegriffen werden.
protected
Auf den Typ oder Member kann nur von Code in der gleichen Klasse oder Struktur oder in einer Klasse, die von dieser Klasse abgeleitet ist, zugegriffen werden.
Aus <https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers>
ZugriffsmodifiziererFreitag, 11. August 2017 09:06
Seite 6
ternärer Operator,•Fragezeichen-Doppelpunkt-Operator•
Auch
genannt.
Syntax:
var = (<Bedingung>) ? <true-Wert> : <false-Wert>;
Dieser Ausdruck lässt sich immer und grundsätzlich auch schreiben als
if (<Bedingung>)
var = <true-Wert>;
else
var = <false-Wert>;
Beide Ausdrücke machen exakt dasselbe.
Bedingter OperatorMittwoch, 16. August 2017 12:18
Seite 7
Dies ist eine Erfindung von Microsoft. Kurz gesagt: es wird eine Methode aufgerufen, die sich aber nach außen wie eine Variable verhält.
Der Zugriff auf eine private-Variable erfolgt hier mittels eines klassischen Getters und Setters:
private int variable;
public int getVariable () return variable;
public void setVariable(int v)
// beliebige Filterung moeglich
if (v > 100)
else variable = v + 200;
variable = v;
Dabei steht es frei, ob beide Methoden oder nur eine realisiert werden. Bei ausschließlichem Schreibzugriff reicht der Setter.
Microsoft hat dann als "Antwort" die Eigenschaften erfunden (in C++.NET gibt es auch das Schlüsselwort "property"). Eigenschaften machen exakt das gleiche wie Getter und Setter, sind nur so "verpackt", daß sie sich wie Variablen verhalten.
private int variable;
public int Variable get return variable;
set // beliebige Filterung moeglich if (value > 100) variable = value; else variable = value + 200;
Später erfolgt der Aufruf:
Variable = 13;
Dadurch, daß der Eigenschaft etwas zugewiesen wird, wir der get-Bereich aufgerufen und beim Auslesen (Anforderung einer Info) der set-Bereich:
Eigenschaften/PropertiesDonnerstag, 17. August 2017 09:00
Seite 8
Console.WriteLine (Variable);
Die set- und get-Bereiche werden als Accessoren bezeichnet, also get-Accessor und set-Accessor.
Es gibt Situationen, in denen die Accessoren minimal bleiben sollen:
public int Variable get return variable;
set variable = value;
Dies kann als
public int Variable get; set;
geschrieben werden.
Seite 9
ref
Variablen werden als Referenzen übergeben und können in der Methode geändert werden.Analog in C: & und *
Aufruf Methode
out
Variablen werden als Referenz übergeben, allerdings ist die Übergabe eine Einbahnstraße, d.h. Werte können nur aus der Methode herausgegeben werden. Auf diese Weise kann eine Methode mehrere Rückgabewerte haben.
Aufruf Methode
ReferenzenMittwoch, 9. August 2017 10:38
Seite 10
Xamarin PlattformDie Xamarin Plattform ist eine Sammlung von mehreren Komponenten. Mit den Komponenten Xamarin.iOS, Xamarin.Android und Xamarin.Mac wird es möglich, native Apps für iOS, Android, Mac und Windows in C# zu schreiben. Für die Entwicklung stehen zwei IDEs zur Verfügung, Visual Studio und Xamarin Studio.
Xamarin.FormsMit dieser Komponente hat der Entwickler die Möglichkeit, auch die UI plattformübergreifend mit nur einer Codebasis zu implementieren. Dabei stellt Xamarin.Forms ein gewisses Kontingent an UI-Elementen zur Verfügung, das auf allen mobilen Plattformen zur Verfügung stehen muss (z. B. eine TextView oder ein Button). Bei der Umsetzung zur nativen App werden diese Forms-Elemente dann in die eigentlichen UI-Elemente der jeweiligen Plattform übersetzt.
Aus <https://ccvossel.de/xamarin/>
Die Umstellung von "Generic" hat nichts mit der Kompilierung zu tun, sondern lediglich mit der Ansicht eines gewünschten Gerätes!
EinführungMontag, 7. August 2017 11:07
Seite 11
Constraints1.Storyboard (Design und XML)2.Referenzen (ref, out)3.Controls4.nint und nfloat5.
Grundlagen + ControlsMittwoch, 9. August 2017 09:32
Seite 13
Constraints
Standardgemäß werden beim Einfügen eines Controls die linke obere Ecke als (x, y)-Position und Breite und Höhe angegeben.Für das aktuell eingestellte Display ist das gut, aber für ein größeres oder kleineres Display nicht. Da würden Controls zu klein bzw. würden nicht vollständig abgebildet.
Hier helfen Constraints (Einschränkungen):Wir geben keine Breite an, sondern den Abstand zum rechten Bildschirmrand. Damit wäre dann die Breite flexibel.
ConstraintsMittwoch, 9. August 2017 10:33
Seite 14
jedes Control ist irgendwie von UIView abgeleitet•v.Hidden = true; // ist unsichtbar•das Präfix "UI" gilt für alle Apple-Controls•
Für alle Views
UIView
eigener Datentyp•die Basisklasse aller Controls•von Haus aus ein Container (kann andere Elemente aufnehmen)•kann beliebige Hintergrundfarbe annehmen•
UISlider
Ereignis: ValueChanged•Min, Max, Value•Min-Tint•Thumb-Tint•Max-Tint•Min- und Max-Graphik•
UISwitch
Ereignis: ValueChanged•Pendant zur CheckBox•On, !On•
UISegmentedControl
Ereignis: ValueChanged•Pendant zu RadioButton•SelectedIndex•
ControlsMittwoch, 9. August 2017 12:32
Seite 15
Ein 32-Bit-Prozessor hat 32 Beinchen für Daten (0 = 0 kein Strom, 1 = 1 Strom).Ein 64-Bit-Prozessor hat 64 Beinchen für Daten (0 = 0 kein Strom, 1 = 1 Strom).
Aus <http://www.amdtown.com/BO4VKGZP/>
Aus <http://www.amdtown.com/BO4VKGZP/>
Ein 32-Biter kann somit als größte Ganzzahl: 232 = 4.294.967.296Darauf entfällt jeweils die Hälfte auf die Zahlen < 0 und auf >= 0:231 = 2.147.483.648 … 2.147.483.647 = 231 - 1.
Ein 64-Biter kann somit als größte Ganzzahl: 264 = 18.446.744.073.709.551.616Darauf entfällt jeweils die Hälfte auf die Zahlen < 0 und auf >= 0:263 = 9.223.372.036.854.775.808 … 9.223.372.036.854.775.807 = 263 - 1.
Das ist üblicherweise der Unterschied zwischen int und long.long-Zahlen auf einem 32-Bit-Rechner müssen umständlich berechnet werden.
nint ist auf einem 32-Bit-Rechner automatisch eine 32-Bit-Zahl und auf einem 64-Bit-Rechner eine
64-Bit-Zahl. Es wird also automatisch das Maximum gewählt.
nfloat ist analog:float auf einem 32-Bit- und double auf einem 64-Bit-Rechner.
nint und nfloatMittwoch, 9. August 2017 14:19
Seite 16
Das Anzeigen von Elementen in einer TableView geschieht halbautomatisch ;-)
Die TableView bekommt ein Modell zugewiesen (Modell muss von "UITableViewSource" erben:
1.
Tabelle.Source = new Modell();
…
public class Modell : UITableViewSource
Es muss die Implementierung der Methoden "GetCell" und "RowsInSection" erfolgen. 2.GetCell liefert die Tabellenzelle und RowsInSection die Anzahl der anzuzeigenden Einträge.
Und hier beginnt der Automatismus: bei der Zuweisung des Modells wird direkt aus der RowsInSection-Methode die Anzahl der Elemente gelesen und danach wird genauso oft die GetCell aufgerufen, d.h. hinter den Kulissen läuft irgendwo eine Schleife ab.
Da wir hier nur die eine Section haben, liefern wir die Anzahl der Eintraege.
Beim Aufruf der GetCell-Methode wird der Index der imaginären Schleife benötigt. Da die Liste zeilenweise aufgebaut wird, benötigen wir also den "Zeilenindex". Dieser wird als Argument mitgeliefert:
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
Die betrachtete Zeile ist in indexPath.Row.
Ausgaben in Konsole: Console.WriteLine (…)•Ansicht mit (auf dem Mac): Debug -> Open System Log …•
ListenFreitag, 11. August 2017 10:35
Seite 17
Im Unterrichtsbeispiel liegt eine Datenbasis in Foirm einer Liste von Strings vor:
OpelMercedesMaseratiMaybachBugattiBorgwardVolkswagenVauxhallAudiPorscheBMW
Der erste Schritt ist die Sortierung:
AudiBorgwardBugattiBMWMaseratiMaybachMercedesOpelPorscheVauxhallVolkswagen
Nun soll der Inhalt der Liste sektioniert werden, sodaß jeder vorkommende Anfangsbuchstabe eine Liste der entsprechenden Einträge hat:
A -> AudiB -> Borgward, Bugatti, BMWM -> Maserati, Maybach, MercedesO -> OpelP -> PorscheV -> Vauxhall, Volkswagen
Dictionary<String, List<String>> …
Daraus folgt folgende Struktur:
Section 0, Row 0: AudiSection 2, Row 1: Maybach…
Indizierte ListenFreitag, 11. August 2017 12:35
Seite 18
Frame
Für alle erzeugten Controls gilt: sie brauchen eine Position (x, y), eine Breite und eine Höhe. Dies geschieht mittels eines Frames, der durch ein CGRect dargestellt wird:
CGRect frame = new CGRect (x, y breite, hoehe);lbl.Frame = frame;
View
Der Standard-Hintergrund unseres Displays ist eine UIView, die per Default den Namen "View"
trägt. Eine UIView ist bekannterweise ein Container, der weitere Elemente aufnehmen kann. Somit auch andere Dinge, die ebenfalls UIView sind.View.Add (vw) oder View.AddSubview (vw);
UIFont
UIFont fnt = UIFont.FromName("Arial", 30);fnt = UIFont.ItalicSystemFontOfSize(27);
lbl.Font = fnt;
So wird der Font gesetzt und mit fnt = UIFont.ItalicSystemFontOfSize(27)kann er auf Italic (Schräg) gesetzt werden. Analog gibt es auch BoldSystemFontOfSize.Ebenfalls ist somit die Schriftgröße änderbar.
Entfernen
Die Methode, von einer View entfernt zu weden, bringt jede UIView selbst mit:lbl.RemoveFromSuperview();
Dynamisch erzeugte ControlsMontag, 14. August 2017 10:26
Seite 19
http://media2.giga.de/2013/02/retina-Apple-Cartoon-lustig.jpg
https://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions
RetinaMittwoch, 16. August 2017 10:55
Seite 21
UIDeviceBatteryState:
Charging: ist am Stron und wird geladen•Full: ist am Strom und voll geladen•Unknown: keine Informationen verfügbar•Unplugged: nicht am Strom und entlädt•
System-InfosDonnerstag, 31. August 2017 15:17
Seite 22
Jede App laeuft in einer sogenannten Sandbox. Dadurch kann eine App eineandere nicht beeinflussen. Daten koennen auch nicht gegenseitig gelesen werden.Um dies zu erreichen, legt das Betriebssystem (iOS) fest, wo welche App ihreDaten unterbringt. Das bedeutet, dass jede App ihr eigenes kleines Dateisystem besitzt.Dieses ist natuerlich per Pfad erreichbar. Der Pfad ist ueber "Environment.SpecialFolder" zu bestimmen. Der Standard fuer Dokumente allerArt ist "MyDocuments".Hier koennen wir schalten und walten wie wir wollen (mit Anlegen/Loeschen von Verzeichnissen und Dateien, usw.).
String documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Der komplette Dateiname besteht aus dem Namen selbst und dem Pfaddorthin. Viele Betriebsysteme haben verschiedene Pfad-Trennzeichen.Das Betriebbsystem kennt sein Trennzeichen am besten, also ueberlassenwir ihm das Einsetzen davon und nutzen eine Funktion.
String datei = Path.Combine(documents, DATEINAME);
DateienDonnerstag, 17. August 2017 11:31
Seite 23
SQlite-Engine in Betriebssystem integriert•http://sqlite.org•Jede Datenbank ist eine eigene Datei!•
Jedes Projekt, das SQLite verwendet, muss einen Verweis zu den SQLite-Bibliotheken haben.Um SQLite-Datenbanken verwenden zu koennen, werden zwei
Rechtsklick auf "Verweise"1.Verweis hinzufuegen2.Assemblys -> Framework3."System.Data.Sqlite" und "System.Data" auswaehlen4."System.Data.Sqlite" wird dann als "Mono.Data.Sqlite" aufgelistet.5.
Bibliotheken benoetigt, die wir anbinden muessen:
DatenbankenFreitag, 18. August 2017 10:53
Seite 25
Zu jedem auszuführenden Befehl wird ein Kommando benötigt (SqliteCommand).Dies wird von der geöffneten Connection geliefert.
Seite 26
eine mehrseitige App ist ein NavigationController zwingend notwendig!!!
Nun sind ein NavigationController und zwei ViewController vorhanden. Wir haben aber schon unseren ViewController, sodass der neue -- mitgelieferte -- nicht gebraucht wird und weichen muss. Dazu: so oft Rechtsklick und "Delete" wählen, bis er weg ist.
SeitenMontag, 21. August 2017 09:59
Seite 27
Unser alter ViewController muss jetzt der neue "Root ViewController" werden.Dazu einfach vom NavigationController zum ViewController mit der gedrückten Controltaste zum ViewController "draggen".
Seite 28
Es ist nun ein Verbindungspfeil aufgetaucht, der die Abhängigkeit zwischen den Controllern zeigt. Es ist nun ebenfalls eine NavigationBar mit einer Titelleiste vorhanden.Jetzt muss nur noch der NavigationController das Startelement sein, d.h. der kleine Pfeil mit dem Fähnchen muss auf den NavigationController zeigen.
Seite 30
Jetzt ist der korrekte Stand erreicht: der NavigationController MUSS der erste Controller sein, den das System "sieht". Er ist nun verantwortlich für sämtliche Seitenwechsel innerhalb unserer App.
Seite 31
Lebenszyklus von Seiten
ViewWillAppear Diese Methode ist die letzte Methode, bevor diese Seite aktiv wird.
ViewDidAppear Diese Methode ist die erste Methode, nachdem diese Seite aktiv wurde.
ViewWillDisappear Diese Methode ist die letzte Methode, bevor diese Seite inaktiv wird.
ViewDidDisappear Diese Methode ist die erste Methode, nachdem diese Seite inaktiv wurde.
ViewDidLoad Wird vor der Methode "ViewWillAppear" aufgerufen und nur einmal pro Instanz.
Lebenszyklus von SeitenDienstag, 22. August 2017 10:48
Seite 33
Ebenfalls können Vorgänge bei App-Zustandsänderungen ausgeführt werden. Dazu gibt es spezielle Methoden, die nur für Apps da sind und die befinden sich in der Datei AppDelegate.cs.
FinishedLaunching Start ist vollzogen
OnResignActivation App wird inaktiv
DidEnterBackground App arbeitet im Hintergrund
WillEnterForeground App kommt in den Vordergrund
OnActivated App ist aktiv
WillTerminate App wird beendet
Lebenszyklus von AppsDonnerstag, 31. August 2017 14:46
Seite 34
Das Zeichnen von Graphiken funktioniert auf allen Views, die von UIView abgeleitet sind. Deshalb wird hier eine Klasse erzeugt, die von UIView erbt.
Liniengraphiken1.Flächengraphiken Keine Fachausdrücke :-D2.
Es wird zwischen zwei Graphikarten unterschieden:
Liniengraphiken werden mittels CGPath gezeichnet. Es sind Linienpfade.
Das Instanziieren einer von UIView abgeleiteten Klasse führt zum Aufruf der Methode Draw,die darum natürlich überschrieben sein muss.
Flächengraphiken können auch als Pfad gezeichnet werden. Es muss nur beim Malendie g.DrawPath(CGPathDrawingMode.Fill);gesetzt werden.
GraphikenFreitag, 25. August 2017 10:57
Seite 35
Der Unterschied zwischen einer Polyline und einem Polygon liegt darin, dass das Polygon immer geschlossen ist, d.h. der letzte Punkt ist mit dem ersten Punkt verbunden! Dies wird im Path mit der Methode ClosePath() erreicht.
Beim Kreisbogen sind die Winkelangaben des Eiunheitskreises zu beachten (0° liegt auf der "Drei-Uhr-Position").
Seite 36
<key>NSPhotoLibraryUsageDescription</key> <string>Diese App benötigt Zugriff auf Fotos.</string>
Info.plistFreitag, 25. August 2017 14:32
Seite 38
https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
Übersicht über die Zusatzinformationen, die mittels webClient.ResponseHeaders[…]);
abgerufen werden können.
WebzugriffeDonnerstag, 31. August 2017 15:19
Seite 39
Bei Sensoren und anderen Requests liefert das System ein Popup, ob der Zugriff erlaubt werden soll. Dazu gibt es bestimmte Keys, denen ein String zugewiesen wird, der dann angezeigt werden soll. Diese Keys sind die sogenannten Cocoa-Keys: https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW27
Eintrag in Info.plist:<key>NSLocationAlwaysUsageDescription</key><string>Darf der Standort ermittelt werden?</string>
SensorenMontag, 28. August 2017 11:03
Seite 40
Top Related