ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΗΣ SMARTPHONE ΓΙΑ ΤΙΣ ΔΡΑΣΤΗΡΙΟΤΗΤΕΣ ΤΟΥ ΜΟΥΣΕΙΟΥ ΕΠΙΣΤΗΜΩΝ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ (Μ.Ε.Τ) ΤΖΟΥΛΑ ΔΗΜΗΤΡΙΟΥ
|
|
- Ἀστάρτη Αντωνοπούλου
- 8 χρόνια πριν
- Προβολές:
Transcript
1 ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΗΣ SMARTPHONE ΓΙΑ ΤΙΣ ΔΡΑΣΤΗΡΙΟΤΗΤΕΣ ΤΟΥ ΜΟΥΣΕΙΟΥ ΕΠΙΣΤΗΜΩΝ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ (Μ.Ε.Τ) Δ Ι Π Λ Ω Μ Α Τ Ι Κ Η Ε Ρ Γ Α Σ Ι Α ΤΖΟΥΛΑ ΔΗΜΗΤΡΙΟΥ ΕΠΙΒΛΕΠΩΝ: Κ. ΣΓΑΡΜΠΑΣ ΠΑΤΡΑ - ΦΕΒΡΟΥΑΡΙΟΣ 2014
2 ΠΙΣΤΟΠΟΙΗΣΗ Πιστοποιείται ότι η διπλωµατική εργασία µε θέµα: Ανάπτυξη εφαρµογής smartphone για τις δραστηριότητες του Μουσείου Επιστηµών και Τεχνολογίας (Μ.Ε.Τ) Του φοιτητή του τµήµατος Ηλεκτρολόγων Μηχανικών & Τεχνολογίας Υπολογιστών Τζούλα Δηµήτριου (Α.Μ. 6861) παρουσιάστηκε δηµόσια και εξετάστηκε στο Τµήµα Ηλεκτρολόγων Μηχανικών & Τεχνολογίας Υπολογιστών στις 12/03/2014 Ο Επιβλέπων Ο Διευθυντής του Τοµέα Κ. Σγάρµπας Επ.Καθηγητής Ν. Φακωτάκης Καθηγητής
3 ΤΙΤΛΟΣ: Ανάπτυξη εφαρµογής smartphone για τις δραστηριότητες του Μουσείου Επιστηµών και Τεχνολογίας (Μ.Ε.Τ) ΣΥΓΓΡΑΦΕΑΣ: Δηµήτριος Ε. Τζούλας (Α.Μ. 6861) ΠΕΡΙΛΗΨΗ: Η παρούσα διπλωµατική εργασία αφορά τη σχεδίαση και υλοποίηση µίας εφαρµογής smartphone σε περιβάλλον ios, η οποία έχει ως σκοπό την προβολή των δραστηριοτήτων του Μουσείου Επιστηµών και Τεχνολογίας (Μ.Ε.Τ) που βρίσκεται στον χώρο του Πανεπιστηµίου Πατρών. Πιο συγκεκριµένα, παρέχει γενικές και χρήσιµες πληροφορίες σχετικά µε το Μ.Ε.Τ, σύντοµη εικονική ξενάγηση στους εκθεσιακούς του χώρους, διευκόλυνση πρόσβασης σε αυτό αλλά και δυνατότητα ενηµέρωσης περί των εκδηλώσεων που φιλοξενεί. ABSTRACT: This diploma dissertation concerns the development of a smartphone application on the ios platform, aiming to introduce the user to the activities of the Museum of Science and Technology which is located in the University of Patras district. In particular, it provides general and useful information about the Museum, short virtual tour at its showrooms, easy access to it and the ability to stay informed of the various events it hosts.
4 ΠΡΟΛΟΓΟΣ Η εργασία αυτή εκπονήθηκε κατά το χρονικό διάστηµα Η υλοποίηση της εφαρµογής πραγµατοποιήθηκε σε υπολογιστή Macintosh για την πλατφόρµα ios (έκδοση 7) της εταιρίας Apple και δοκιµάστηκε σε simulator αλλά και σε φυσική συσκευή (iphone). Ο χρόνος που αφιέρωθηκε στην εκπόνηση αυτής της εργασίας µοιράστηκε ανάµεσα σε επισκέψεις στο Μουσείο Επιστηµών και Τεχνολογίας και στην υλοποίηση της εφαρµογής. Αυτά έγιναν σε βάθος χρόνου και κατά διαστήµατα χρειάστηκε να γίνουν αναθεωρήσεις αλλά και αλλαγές καθώς η πλατφόρµα ios αναβαθµιζόταν σε νεότερες εκδόσεις, ενώ το Μουσείο προχωρούσε σε εµπλούτιση και αλλαγές των εκθεσιακών χώρων του αλλά και της τεχνολογικής του υποδοµής. Αρχικά, το πρώτο διάστηµα πραγµατοποιήθηκε καταγραφή ιδεών, προτάσεων και απαιτήσεων ενώ στην συνέχεια η κύρια ασχολία ήταν ο προγραµµατισµός της εφαρµογής. Η ιδέα προέκυψε µετά από πρόταση της κ. Αθηνάς Πυλαρινού (αρµόδιας τεχνικών θεµάτων του Μουσείου) σε εκδήλωση της φοιτητικής οµάδας του Πανεπιστηµίου Πατρών ibite. Επιβλέπων καθηγητής αυτής της διπλωµατικής εργασίας ήταν ο κ. Κυριάκος Σγάρµπας ο οποίος βοήθησε µε κάθε δυνατό τρόπο για να ξεπεραστούν τα όποια προβλήµατα εµφανίστηκαν κατά την διάρκεια της εκπόνησής της, ενώ ανεκτίµητης αξίας βοήθεια στον σχεδιασµό της προσέφερε η κ. Θεολόγη-Γκούτη Πένυ, υπεύθυνη του Μουσείου Επιστηµών και Τεχνολογίας, τους οποίους και ευχαριστώ πολύ.
5 1. ΕΙΣΑΓΩΓΗ ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ 1.1. Στόχος και χρησιµότητα Πρακτικές δυσκολίες στην υλοποίηση ΓΕΝΙΚΕΣ ΓΝΩΣΕΙΣ 2.1. Η γλώσσα προγραµµατισµού των Macintosh - Objective C Γενικά Εισαγωγή στην αντικειµενοστρέφεια Δοµή αρχείων της γλώσσας Objective C Δηµιουργία στιγµιοτύπων Πρωτόκολλα Η έννοια του delegate H κατευθυντική εντολή #import Τύποι δεδοµένων Επιλογείς και µηνύµατα Μέθοδοι πρόσβασης και ιδιότητες Σύνταξη µε τελεία Διαχείριση Μνήµης Μια σύντοµη ανασκόπηση στο παρελθόν Γενικά Retain και Release Autorelease Pool Automatic Reference Counting (ARC) Γενικά...17
6 Κανόνες χρήσης ARC Δηλώσεις ιδιοτήτων µε και χωρίς ARC Μετατροπή κώδικα σε ARC Προβλήµατα του ARC Η προγραµµατιστική σουίτα Xcode Γενικά Βασική Διεπαφή Πρότυπα Xib και Storyboards Η αρχή του Model - View - Controller (MVC) Υπόλοιπες Γνώσεις Αλλες γλώσσες προγραµµατισµού Πανόραµα Γενικά Τύποι πανοραµικών φωτογραφιών Η ΕΦΑΡΜΟΓΗ 3.1. Το κύριο µενού της εφαρµογής Αρχική Οθόνη MainViewController Το Μουσείο ΤοΜΕΤ METDetailsView Τι µπορώ να δω στο Μ.Ε.Τ PlacesToSee PanoramaController ObjectDetails...42
7 Πως µπορώ να έρθω στο Μ.Ε.Τ Navigation Ηµερολόγιο Εκδηλώσεων CalendarView EventPreview Επικοινωνία Contact ΠΑΡΑΔΕΙΓΜΑΤΑ ΧΡΗΣΗΣ ΜΕΤΡΗΣΕΙΣ ΣΥΜΠΕΡΑΣΜΑΤΑ ΚΑΙ ΜΕΛΛΟΝΤΙΚΕΣ ΒΕΛΤΙΩΣΕΙΣ 6.1. Συµπεράσµατα Μελλοντικές Βελτιώσεις ΠΑΡΑΡΤΗΜΑ 7.1. Κώδικας Βιβλιογραφία...96
8
9 ΚΕΦΑΛΑΙΟ 1 ΕΙΣΑΓΩΓΗ 1.1. Στόχος και χρησιµότητα Στόχος της παρούσας διπλωµατικής εργασίας είναι ο σχεδιασµός και η υλοποίηση µιας εφαρµογής smartphone σε περιβάλλον ios για την προβολή των δραστηριοτήτων του Μουσείου Επιστηµών και Τεχνολογίας (Μ.Ε.Τ) που βρίσκεται στον χώρο του Πανεπιστηµίου Πατρών. Η γενικότερη ιδέα είναι ότι οποιοσδήποτε κατέχει µία συσκευή που τρέχει το λειτουργικό σύστηµα ios, να µπορεί µέσα σε δευτερόλεπτα να κατεβάσει την εφαρµογή στην συσκευή του και να λάβει άµεσα όλη την χρήσιµη πληροφορία που χρειάζεται για το Μουσείο. Πιο συγκεκριµένα, ο χρήστης εγκαθιστώντας την εφαρµογή στην συσκευή του µπορεί: Να δει επιλεκτικά πληροφορίες για το µουσείο που τον ενδιαφέρουν, όπως για την Δράση του, την Ιστορία του, τις Εκδηλώσεις που φιλοξενεί, τον Εθελοντισµό, τις Ηµέρες/Ώρες λειτουργίας του Μουσείου κ.ά. Να πραγµατοποιήσει µία σύντοµη εικονική ξενάγηση στους εκθεσιακούς χώρους του Μουσείου Να λάβει κατευθύνσεις για την εύκολη προσέλευση στον χώρο του Μουσείου Να µένει ενηµερωµένος για τις προσεχείς εκδηλώσεις που πρόκειται να διοργανώθουν/φιλοξενηθούν στον χώρο του Μουσείου Να επικοινωνήσει τηλεφωνικά ή µέσω Ίντερνετ µε τους υπεύθυνους του Μουσείου 1.2. Πρακτικές δυσκολίες στην υλοποίηση Η κυριότερη δυσκολία παρουσιάστηκε στην υλοποίηση της εικονικής ξενάγησης καθώς οι εκθεσιακοί χώροι έπρεπε να φωτογραφηθούν µε ειδικό τρόπο και ειδικό φακό ο οποίος είναι υπερ-ευρυγώνιος (γνωστός και ως Fish-Eye Lens). Μετά από αρκετές απόπειρες να υλοποιηθεί απουσία αυτού και αφού το αποτέλεσµα δεν ήταν αρκετά ικανοποιητικό, το πρόβληµα λύθηκε µε την παρέµβαση του επιβλέποντα κ. Σγάρµπα ο οποίος φρόντισε να διευκολύνει την όλη διαδικασία προµηθεύοντας τον φακό που χρειαζόταν. 1
10 Άλλη δυσκολία αποτέλεσε ο εργονοµικός σχεδιασµός της γραφικής διεπαφής χρήστη καθώς η εφαρµογή απευθύνεται σε ένα ευρύ ηλικιακό φάσµα χρηστών. Επίσης, προέκυψαν αρκετά προβλήµατα στην υλοποίηση λόγω του ότι χρησιµοποιήθηκαν ορισµένα open source projects τρίτων σε κάποια κοµµάτια της εφαρµογής, τα οποία δεν ήταν βελτιστοποιηµένα και σχεδιασµένα για την έκδοση λειτουργικού πάνω στο οποίο αναπτύχθηκε η εφαρµογή. 2
11 ΚΕΦΑΛΑΙΟ 2 ΓΕΝΙΚΕΣ ΓΝΩΣΕΙΣ 2.1. Η γλώσσα προγραµµατισµού των Macintosh - Objective C Γενικά Η γλώσσα προγραµµατισµού που χρησιµοποιείται στο λειτουργικό σύστηµα MacOS των ηλεκτρονικών υπολογιστών Macintosh, και κατ επέκταση στις ios συσκευές, είναι κατά κύριο λόγο η Objective-C. Η γλώσσα αυτή αποτελεί ένα υπερσύνολο της γλώσσας C. Πρόκειται για µία αντικειµενοστραφή εκδοχή της και ασφαλώς είναι γλώσσα υψηλού επιπέδου στηριζόµενη σε όλες τις αρχές της αντικειµενοστρέφειας (κλάσεις, στιγµιότυπα, ιεράρχηση, κληρονοµικότητα κτλ). Έχει πολλές οµοιότητες µε την γλώσσα C αλλά αρκετά επαυξηµένες δυνατότητες, ενώ η βασική της σύνταξη ακολουθεί τα πρότυπα της C στο κοµµάτι που αφορά µη αντικειµενοστραφείς λειτουργίες. Ο Compiler που χρησιµοποιείται είναι ο GCC (GNU Compiler Collection) και ο οποίος µπορεί να κάνει compile C, C++ και Objective C την ίδια στιγµή. Επίσης ένα ακόµα στοιχείο που πρέπει ν αναφερθεί είναι ότι η Objective C είναι ιδιαίτερα περιγραφική γλώσσα. Τα ονόµατα των µεθόδων της είναι συνήθως µεγάλα και αυτό γιατί ο τίτλος αυτών τείνει να περιγράφει πλήρως την λειτουργία τους Εισαγωγή στην αντικειµενοστρέφεια Πριν την εισαγωγή του αντικειµενοστραφή προγραµµατισµού (OOP Object Oriented Programming), επικρατούσε ο διαδικαστικός προγραµµατισµός (Procedural Programming). Η διαφορά τους εστιάζεται κατά κύριο λόγο στο επίπεδο της αφαιρετικότητας που ο καθένας προσφέρει. Πιο συγκεκριµένα, στον διαδικαστικό προγραµµατισµό η αφαιρετικότητα επιτυγχάνεται µέσω των συναρτήσεων (Functions), οι οποίες παίρνουν ως είσοδο τα δεδοµένα και εκτελούν την λειτουργία για την οποία έχουν δηµιουργηθεί. Καθώς όµως οι απαιτήσεις αυξάνονται, αυξάνεται το µέγεθος των προγραµµάτων και των δεδοµένων έτσι ώστε µετά από ένα σηµείο να γίνεται προγραµµατιστικά ασύµφορο. 3
12 Τη λύση έρχεται να δώσει ο αντικειµενοστραφής προγραµµατισµός. Σ αυτό το είδος, ορίζουµε την έννοια του αντικειµένου (object). Το κάθε αντικείµενο χαρακτηρίζεται από την δική του συµπεριφορά, τα δικά του χαρακτηριστικά και τα δικά του δεδοµένα. Πιο συγκεκριµένα ένα αντίκεµενο χαρακτηρίζεται από τις εξής ιδιότητες: Έχει την δική του συµπεριφορά. Έχει την δική του εσωτερική κατάσταση. Αποστέλλει και λαµβάνει µηνύµατα αλληλεπιδρώντας µε άλλα αντικείµενα αλλά και µε τον εαυτό του. Έχει τα δικά του δεδοµένα. Σύµφωνα µε το συντακτικό της Objective-C, η αποστολή ενός µηνύµατος σε ένα αντικείµενο (ή κατά την C η κλήση µιας µεθόδου), ακολουθεί την µορφή: [object method:argument]; Όπου: object = το αντικείµενο method = η µέθοδος (ή συνάρτηση) που καλούµε argument = η παράµετρος που εισάγουµε στην µέθοδο Η µορφή αυτή µπορεί να γενικευθεί και τότε γράφεται ως: [object method:argument1 moremethodtext:argument2... methodfinaltext:argumentn]; Δοµή αρχείων της γλώσσας Objective C Η δοµή των αρχείων ενός προγράµµατος γραµµένο σε γλώσσα Objective-C στηρίζεται σε δύο τύπους αρχείων: 4 Στα αρχεία κεφαλίδων (header ή interface files) και Στα αρχεία υλοποίησης κώδικα (implementation files)
13 Τα αρχεία κεφαλίδων περιέχουν δηλώσεις ονοµάτων και ιδιοτήτων µεταβλητών, αντικειµένων και µεθόδων. Συγκεκριµένα, σε αυτά τα αρχεία δηλώνεται το σύνολο των µεταβλητών που χρησιµοποιούνται από τις περισσότερες µεθόδους και οι τύποι των µεθόδων της εκάστοτε κλάσης. Τα αρχεία κεφαλίδων έχουν κατάληξη.h και ουσιαστικά είναι αυτά που αντιπροσωπεύουν την «διεπαφή» της κλάσης (γι αυτό και αναφέρονται και ως interface files). Τα αρχεία υλοποίησης κώδικα περιέχουν τις υλοποιήσεις των µεθόδων που δηλώνονται στα αρχεία κεφαλίδων (γι αυτό και αναφέρονται ως implementation files). Έχουν την κατάληξη.m και ουσιαστικά είναι αυτά στα οποία στηρίζεται όλη η λειτουργία του προγράµµατος µας. Η γενική µορφή µιας κλάσης γραµµένης σε γλώσσα Objective-C ακολουθεί την εξής classname : superclassname // Instance Variables + classmethod1; + (return_type)classmethod2; + (return_type)classmethod3:(param1_type)param1_varname; - (return_type)instancemethod1:(param1_type)param1_varname: (param2_type)param2_varname; - (return_type)instancemethod2withparameter: (param1_type)param1_varname Αναλύτικα έχουµε: Στην πρώτη γραµµή µετά το όνοµα της κλάσης προς υλοποίηση (classname), δηλώνεται η κλάση από την οποία κληρονοµεί τα χαρακτηριστικά της (superclassname). Η κλάση αυτή είναι γνωστή και ως υπερκλάση. Σε περίπτωση που δεν θέλουµε η κλάση µας να κληρονοµήσει οποιοδήποτε χαρακτηριστικό τότε στην θέση της υπερκλάσης θα πρέπει να βάλουµε την κλάση NSObject η οποία είναι η βάση όλων των κλάσεων. Στην συνέχεια ακολουθεί η δήλωση των ονοµάτων και τύπων των µεταβλητών/αντικειµένων που πρόκειται να χρησιµοποιηθούν από τις περισσότερες µεθόδους και αυτό γίνεται µέσα στις αγκύλες αµέσως µετά την δήλωση της υπερκλάσης. 5
14 Έπειτα ακολουθεί η δήλωση των τύπων και των ονοµάτων των µεθόδων. Εδώ έχουµε δύο κατηγορίες: Τις µεθόδους κλάσης οι οποίες ακολουθούν µετά το σύµβολο «+» (class methods) Τις µεθόδους στιγµιοτύπου οι οποίες ακολουθούν µετά το σύµβολο «-» (instance methods) Αµέσως µετά το σύµβολο την δήλωσης τύπου κλάσης (class method ή instance method) ακολουθεί ο ορισµός του τύπου αντικειµένου που επιστρέφουν ως αποτέλεσµα. Αυτό µπορεί να είναι: void, δηλαδή να µην επιστρέφει κάτι κάποιος πρωτογενής τύπος της C όπως int, float, char κλπ id, που σηµαίνει «δείκτης σε οτιδήποτε αντικείµενο». Μετατρέπεται σε οποιοδήποτε αντικείµενο κατά την ώρα εκτέλεσης (αυτό είναι ένα από τα στοιχεία που καθιστούν την Objective-C δυναµική γλώσσα προγραµµατισµού). δείκτης σε συγκεκριµένου τύπου αντικείµενο Η γενική µορφή ενός αρχείου υλοποίησης κώδικα γραµµένου σε γλώσσα Objective-C ακολουθεί την εξής classνame + (return_type)classmethod // implementation - (return_type)instancemethod // Δηµιουργία στιγµιοτύπων Για την δηµιουργία ενός στιγµιοτύπου απαιτούνται δύο βήµατα: 1. Δέσµευση χώρου στη µνήµη (alloc) 2. Αρχικοποίηση (init) 6
15 Αφού πραγµατοποιηθούν αυτά τα δύο βήµατα, το αντικείµενο είναι πλέον έτοιµο να χρησιµοποιηθεί. Η γενική µορφή της παραπάνω διαδικασίας είναι η εξής: MyObject *anobject = [[MyObject alloc] init]; Αν και περιγράφουµε δύο βήµατα σε σειρά πιο πάνω, συνήθως αυτά γίνονται σε µία γραµµή κώδικα, καθώς το ενδιάµεσο αντικείµενο αφού έχει γίνει η δέσµευση του χώρου είναι άχρηστο χωρίς την αρχικοποίηση και επίσης επειδή µερικές φορές το αντικείµενο που επιστρέφει η αρχικοποίηση δεν είναι το ίδιο, οπότε υπάρχει πρόβληµα. Μία ακόµα πιο σύντοµη µορφή η οποία θυµίζει τη διαδικασία δέσµευσης και αρχικοποίησης άλλων προγραµµατιστικών γλωσσών είναι η εξής: MyObject *o = [MyObject new]; Η παραπάνω µορφή αποτελεί την πιο κοινή περίπτωση και έχει εφαρµογή σε όλες τις κλάσεις. Μια πιο προσαρµοσµένη µορφή είναι: MyObject *anobject = [[MyObject alloc] initwithstring:mystring]; Σ αυτή την περίπτωση η δέσµευση µνήµης γίνεται κατά τα γνωστά µε την alloc αλλά έχουµε προσαρµοσµένη αρχικοποίηση µε το πέρασµα µιας παραµέτρου. Η εντολή alloc φροντίζει για την δέσµευση επαρκούς χώρου για όλες τις µεταβλητές που έχει στο αρχείο κεφαλίδας το εκάστοτε στιγµιότυπο. Η εντολή init αρχικοποιεί το δεσµευµένο στη µνήµη στιγµιότυπο και ακολουθεί την εξής µορφή: - (id)init self = [super init]; if (self) // perform initialization of object here return self; 7
16 Αρχικά παρατηρούµε ότι το αντίκειµενο επιστροφής είναι τύπου id, που όπως αναφέραµε πιο πάνω σηµαίνει «δείκτης σε οτιδήποτε αντικείµενο». Έπειτα στην δεύτερη γραµµή, γίνεται µία κλήση στην υπερκλάση του αντικειµένου στο οποίο το αντικείµενο αναθέτει τον εαυτό του. Αν είναι έγκυρο το ίδιο, τότε προχωράει στις αρχικοποιήσεις. Αν δεν είναι έγκυρο τότε επιστρέφεται η τιµή nil, δηλαδή τίποτα ή µηδέν (γνωστό ως null σε άλλες γλώσσες προγραµµατισµού) Πρωτόκολλα Η Objective-C δεν υποστηρίζει πολλαπλή κληρονοµικότητα, όµως έχει τα πρωτόκολλα µέσω των οποίων κατά κάποιον υλοποιεί την λειτουργικότητα της. Τα πρωτόκολλα διαχωρίζονται σε: Επίσηµα (formal), τα οποία ορίζουν µεθόδους που η κλάση που τα εφαρµόζει είναι υποχρεωµένη να υλοποιήσει. Ανεπίσηµα (informal), τα οποία ορίζουν προαιρετικές µεθόδους. - (void)lock; - Η σύνταξη ενός πρωτοκόλλου ορίζεται ως Locking Η κλάση, για να δηλώσει ότι υπόκειται σε ένα πρωτόκολλο, το ορίζει στο αρχείο κεφαλίδας της ως NSLock : NSObject <Locking> Η έννοια του delegate Delegation (ή αλλιώς αντιπροσωπία) ονοµάζεται η ανάθεση της εξουσιοδότησης και της ευθύνης µια κλάσης για την διαχείρηση κάποιας ενέργειας σε µία άλλη που είναι περισσότερο αρµόδια από την ίδια. Δεν είναι απαραίτητα γνωστή η διαδικασία που ακολουθεί η 8
17 αρµόδια κλάση για την επίτευξη αυτού που καλείται να αντιµετωπίσει αλλά µας αρκεί το να έχει δηλώσει ότι µπορεί να αναλάβει. Για να δηλωθεί η ιδιότητα του delegate χρησιµοποιούνται τα πρωτόκολλα. Σε πολλά αντικείµενα που βρίσκονται ήδη στις υπάρχουσες βιβλιοθήκες, οφείλουµε να υλοποιήσουµε τις µεθόδους που σχετίζονται µε το delegate καθώς στην αντίθετη περίπτωση το αντίκειµενο µας είτε θα υπολειτουργεί είτε δεν θα λειτουργεί καθόλου. Πιο συγκεκριµένα, σε περίπτωση που αγνοήσουµε την προσθήκη του απαιτούµενου delegation κώδικα µπορούν να συµβούν τα παρακάτω: Ξαφνικός τερµατισµός εφαρµογής Προκαθορισµένη (Default) συµπεριφορά Αδυναµία σωστής απόκρισης Με την δηµιουργία της οποιασδήποτε εφαρµογής, παράλληλα δηµιουργείται και το Application Delegate, το οποίο είναι ο πρώτος και βασικότερος «αντιπρόσωπος» καθώς είναι αυτός που διαχειριστεί τα µηνύµατα που θα λάβει η εφαρµογή µας απο το λειτουργικό σύστηµα. Δηλαδή θα αναλάβει να δράσει ή να απαντήσει σε καταστάσεις όπως κάποια προσωρινή διακοπή λειτουργίας (π.χ. τηλεφωνική κλήση), κίνδυνο ξαφνικής απεργοποίησης συσκευής λόγω έλλειψης µπαταρίας, κατανάλωση ιδιαίτερα πολλής µνήµης και άλλα H κατευθυντική εντολή #import Στην Objective C χρησιµοποιείται η εντολή #import για να συµπεριλάβουµε τα αρχεία που χρειαζόµαστε κατά τη διάρκεια της σύνθεσης του προγράµµατος (compiling). Το πλεονέκτηµά της έναντι της γνωστής #include της C είναι ότι φροντίζει να συµπεριλάβει τα αρχεία µόνο µια φορά σε περίπτωση πολλαπλής εισαγωγής τους. Έτσι εξοικονοµείται χρόνος και πόροι του συστήµατος. Η #import µπορεί να εισαχθεί είτε στο αρχείο κεφαλίδας είτε στο αρχείο υλοποίησης κώδικα αλλά προτιµότερο είναι στο πρώτο καθώς το αρχείο κώδικα πάντα συµπεριλαµβάνει το αρχείο κεφαλίδας µε ότι αυτό συνεπάγεται. 9
18 Τύποι Δεδοµένων Η Objective C υποστηρίζει: Τους πρωτογενείς τύπους δεδοµένων της C όπως int, float, double, char κ.ά. Την Boolean µεταβλητή (YES/NO ή 1/0) id, δηλαδή δείκτη σε αντικείµενο οποιασδήποτε κλάσης Οποιοδήποτε αντικείµενο µπορεί να δηµιουργηθεί βάσει των συµπεριλαµβανοµένων frameworks στην εφαρµογή Επιλογείς και µηνύµατα Ένας επιλογέας αποτελεί έναν δείκτη σε µια µέθοδο (συνάρτηση). Για την ακρίβεια, αποτελούν δείκτη όχι σε µία συγκεκριµένη συνάρτηση, αλλά σε οποιαδήποτε έχει το ίδιο όνοµα µε αυτό του επιλογέα. Αυτό είναι ένα ακόµα χαρακτηριστικό της δυναµικότητας της Objective C. Η κλήση µιας µεθόδου ενός αντικειµένου έχει την εξής µορφή: [receiver method:parameter]; Μ αυτή την γραµµή κώδικα γίνεται το πέρασµα µιας παραµέτρου (ή αλλιώς η αποστολή ενός µηνύµατος) σε έναν δέκτη. O επιλογέας είναι το κοµµάτι method: και η υλοποίηση της µεθόδου γίνεται σε κάποιο σηµείο του αρχείου υλοποίησης κώδικα. Το µήνυµα που στέλνεται στο αντικείµενο είναι το κοµµάτι method:parameter ενώ ο δέκτης είναι είτε το στιγµιότυπο της ίδιας κλάσης (self) είτε κάποιας άλλης Μέθοδοι πρόσβασης και ιδιότητες Όντας αντικειµενοστραφής γλώσσα, η Objective C χαρακτηρίζεται από επίπεδα προστασίας δεδοµένων της κάθε κλάσης. Δηλαδή, τα δεδοµένα και οι µεταβλητές της κάθε κλάσης είναι προσβάσιµα µόνο από την ίδια. Για να χρησιµοποιηθούν οι τιµές µιας µεταβλητής και τα δεδοµένα σε άλλη κλάση, ορίζουµε κάποιες συναρτήσεις µε τις οποίες έχουµε πρόσβαση σ αυτά. Αυτές είναι οι λεγόµενες µέθοδοι πρόσβασης (accessor methods) οι οποίες χωρίζονται σε µεθόδους ανάκτησης δεδοµένων (getters) και µεθόδους τοποθέτησης δεδοµένων (setters). 10
19 H σύνταξη ενός getter ακολουθεί την εξής µορφή: variable = [object variablename]; ενώ η σύνταξη ενός setter ακολουθεί την µορφή: [object setvariablename: value]; Η δήλωση των µεθόδων get και set γίνεται ως εξής: //Δήλωση µεταβλητών int age; //Δήλωση µεθόδων - (int) age; - (void) setage: (int) newage; Υπάρχει όµως και ένας άλλος τρόπος για να επιτύχουµε την ίδια λειτουργικότητα και µάλιστα µε συνοπτικότερη διαδικασία. Αυτό επιτυγχάνεται µέσω των κατευθυντικών Χρησιµοποιώντας αυτές τις εντολές λοιπόν αποφεύγουµε την υλοποίηση των µεθόδων get και set. To µόνο που χρειαζεται είναι η δήλωση variabletype variablename; στο αρχείο κεφαλίδας µετά τις δηλώσεις µεταβλητών και variablename; στο αρχείο υλοποίησης κώδικα. Επίσης µέσω των properties µας δίνεται η δυνατότητα καλύτερης διαχείρησης της µνήµης, αν και πλέον δεν έχει και τόσο µεγάλη σηµασία αφού έχει καθιερωθεί το σύστηµα Automatic Reference Counting (ARC) το οποίο και αναφέρεται παρακάτω. 11
20 Ένα παράδειγµα που περιλαµβάνει τα παραπάνω είναι το εξής: //Δήλωση µεταβλητών int age; NSString *name; //Δήλωση µεθόδων - (int) age; - (void) setage: (int) newage; - (NSString *) name; - (void) setname: (NSString *) newname; Μπορούµε να αντικαταστήσουµε τις τέσσερις τελευταίες γραµµές που ορίζουν τους getters και setters για για τις µεταβλητές age και name µε αυτές: (στο αρχείο int NSString *name; (στο αρχείο υλοποίησης name; Στην περίπτωση που θέλουµε να προσδώσουµε έξτρα ιδιότητες σε µια µεταβλητή, το δηλώνουµε ακριβώς µετά από την όπως (readonly) NSString *name; Οι διαθέσιµες ιδιότητες είναι: Atomic Nonatomic Readwrite Readonly Retain Copy Assign Strong 12
21 Atomic Η ιδιότητα σηµαίνει ότι το αντικείµενο ή η µεταβλητή είναι thread-safe. Thread-safe σηµαίνει ότι µόνο ένα νήµα δεδοµένου στιγµιοτύπου δεδοµένης κλάσης µπορεί να έχει πρόσβαση στο αντικείµενο/ µεταβλητή. Έτσι εξασφαλίζεται ένα επίπεδο ασφαλείας αλλά θεωρητικά µπορεί να κάνει την ροή της εφαρµογής πιο αργή. Η ιδιότητα αυτή αποτελεί την προεπιλογή. Nonatomic Η ιδιότητα αυτή σηµαίνει ότι ένα αντικείµενο/µεταβλητή µπορεί να διαβαστεί/εγγραφεί παράλληλα από πολλά νήµατα. Αυτό προφανώς µπορεί να επιφέρει καταστροφικές συνέπειες όπως απώλεια δεδοµένων, λάθος δεδοµένα, απρόσµενο τερµατισµό της εφαρµογής κ.ά. αλλά προσφέρει ταχύτητα. Readwrite Η ιδιότητα αυτή σηµαίνει ότι χρησιµοποιώντας το θα δηµιουργηθεί getter και setter. Η ιδιότητα αυτή αποτελεί την προεπιλογή. Readonly Θα δηµιουργθηκεί µόνο getter για την ανάγνωση της τιµής της µεταβλητής. Χρησιµοποιείται συνήθως για µεταβλητές που δεν θέλουµε ν αλλάξουν καθόλου κατά την δηµιουργία κάποιου αντικειµένου. Retain Η ιδιότητα αυτή απαιτείται όταν έχουµε δείκτη σε αντικείµενο. Η µέθοδος ανάθεσης τιµής θα αυξήσει το retain count του αντικειµένου ώστε να παραµείνει στην µνήµη. Η ιδιότητα αυτή αποτελεί την προεπιλογή. Copy Η ιδιότητα αυτή σηµαίνει ότι το στιγµιότυπο της κλάσης θα περιέχει το δικό του αντίγραφο. Δεν δηµιουργούνται setter και getter µέθοδοι µε αυτή την ιδιότητα. Αν χρησιµοποιηθεί αυτή η ιδιότητα, δεν µπορεί να χρησιµοποιηθεί η retain. Assign Η ιδιότητα αυτή δηµιουργεί setter µέθοδο η οποία αναθέτει την τιµή στην µεταβλητή του στιγµιοτύπου άµεσα αντί να την αντιγράφει ή να την διατηρεί στην µνήµη (retain). Η ιδιότητα αυτή είναι καλύτερη για πρωτογενείς τύπους όπως NSInteger και CGFloat ή αντικείµενα τα οποία δεν µας ανήκουν άµεσα όπως τα delegates. Strong Η ιδιότητα αυτή χρησιµοποιείται αντί της assign όταν έχει ενεργοποιηθεί το Automatic Reference Counting (ARC). 13
22 Σύνταξη µε τελεία Η σύνταξη µε τελεία είναι ένας άλλος τρόπος κλήσης µεθόδων η οποία έγινε υλοποιήσιµη µετά από την έκδοση της Objective C 2.0. Η χρήση της γίνεται ως εξής: self.age = 30; η οποία είναι ισοδύναµη µε την εντολή: [self setage:30]; Σηµαντική επισήµανση σ αυτό το σηµείο είναι ότι η σύνταξη µε τελεία πάντα καλεί τις µεθόδους ανάκτησης και τοποθέτησης δεδοµένων (getter και setter). Έτσι ακολουθείται η σωστή διαδικασία διαχείρησης µνήµης που έχει δηλωθεί της µεταβλητής Διαχείριση Μνήµης Από τα σηµαντικότερα θέµατα που προκύπτουν όταν προγραµµατίζουµε για φορητές συσκευές, είναι αυτό της διαχείρισης µνήµης, καθώς οι πόροι είναι αρκετά περιορισµένοι σε σχέση µε έναν σταθερό ηλεκτρονικό υπολογιστή. Συνεπώς είναι αναγκαία η σωστή διαχείριση µνήµης ώστε να αποφύγουµε τυχόν απρόβλεπτες αποτυχίες λογισµικού, όπως τον ξαφνικό τερµατισµό της εφαρµογής. H Objective C ως δυναµική γλώσσα προγραµµατισµού, επιτρέπει την δέσµευση και αποδέσµευση µνήµης για αντικείµενα κατά την διάρκεια της εκτέλεσης και χωρίς να είναι γνωστό το µέγεθος τους εκ των προτέρων, δηλαδή κατά την διάρκεια της σύνθεσης (complile) Μια σύντοµη ανασκόπηση στο παρελθόν Γενικά Προηγουµένως η διαδικασία που έπρεπε να ακολουθηθεί για την σωστή και ολοκληρωµένη διαχείρηση µνήµης ήταν συνοπτικά η εξής: Δέσµευση µνήµης για το αντικείµενο που µας ενδιαφέρει (alloc) Αρχικοποίηση του αντικείµενου ώστε να µπορεί να χρησιµοποιηθεί (init) 14
23 Διατήρηση του αντικειµένου στην µνήµη σε περίπτωση που το χρειάζεται το πρόγραµµα για κάποιο χρονικό διάστηµα (retain) Αποδέσµευση της κατέχουσας µνήµης του αντικειµένου όταν πλέον θα σταµατήσει να είναι χρήσιµο (dealloc) Ο κύκλος αυτός φέρνει την ισορροπία στην χρήση της διαθέσιµης µνήµης. Σε περίπτωση που το αντικείµενο µας δεν αποδεσµευτεί από την µνήµη, τότε παρουσιάζεται µία «διαρροή µνήµης» (memory leak). Αν συνεχώς δηµιουργούνται διαρροές µνήµης τότε κάποια στιγµή ενδέχεται το λειτουργικό σύστηµα της συσκευής µας να τερµατίσει την εφαρµογή. Απρόσµενος τερµατισµός ενδέχεται να προκύψει και σε περίπτωση που υπάρξει ανάκληση σε δείκτη σε χώρο της µνήµης που έχει ήδη αποδεσµευτεί ή δεν υπάρχει (bad memory access) Retain και Release Επειδή ένα αντικείµενο ενδέχεται να χρησιµοποιείται για κάποιο χρονικό διάστηµα, θα πρέπει να το κρατήσουµε στην µνήµη, για να αποφύγουµε αστοχίες ανάκλησής του και απώλεια δεδοµένων. Έτσι λοιπόν χρησιµοποιείται ένας αριθµός που δείχνει πότε ένα αντικείµενο πρέπει να αποδεσµευτεί από την µνήµη. Ο αριθµός αυτός ονοµάζεται retain count. Όταν δηµιουργούµε ένα αντικείµενο (µε εντολή alloc ή copy), το retain count του ορίζεται ίσο µε 1. Σε περίπτωση που θέλουµε να αυξήσουµε τον αριθµό αυτό κρατώντας έτσι το αντίκειµενο στην µνήµη, καλούµε την εντολή retain ως: [object retain]; Ενώ σε περίπτωση που θέλουµε να τον µειώσουµε καλούµε την εντολή release ως: [object release]; Όταν το retain count φτάσει στην τιµή 0, τότε καλείται η εντολή dealloc η οποία αποδεσµεύει τον χώρο που αυτό είχε καταλάβει στην µνήµη καταστρέφοντας το. 15
24 Συνεπώς η ορθή διαχείριση µνήµης µε τις εντολές retain και release κρίνεται αναγκαία Autorelease Pool Στην περίπτωση που χρειάζεται να ανεθέσουµε την διαχείριση ενός αντικειµένου σε κάποιο άλλο στιγµιότυπο, θα πρέπει να φροντίσουµε να περάσουµε και την σχετική πληροφορία ώστε να αυτό να γνωρίζει πως να το διαχειριστεί, δηλαδή αν είναι αυτό υπεύθυνο να αποδεσµεύσει απ την µνήµη το αντικείµενο ή το στιγµιότυπο στο οποίο ανήκε αρχικά. Πιο συγκεκριµένα, αυτό πρέπει να φαίνεται στο όνοµα της µεθόδου, δηλάδη αν το όνοµά της περιέχει alloc, new ή copy τότε ο παραλήπτης αναλαµβάνει την αποδέσµευση, ενώ διαφορετικά το αναλαµβάνει η µέθοδος που το δηµιούργησε. Το πρόβληµα που µπορεί να εµφανιστεί εδώ, µπορεί να γίνει κατανοητό µε ένα απλό παράδειγµα: - (NSString *)height NSString *myheight = [[NSString alloc] initwithformat:@ %@, %@, meters, centimeters]; [myheight release]; return myheight; Η µέθοδος αυτή αποδεσµεύει το αντικείµενο πριν το επιστρέψει µε αποτέλεσµα την επιστροφή ενός null αντικειµένου και άρα απώλεια πληροφορίας χάρην καλής διαχείρισης µνήµης. Προφανώς αυτό είναι λάθος. Μπορούµε λοιπόν να κάνουµε το εξής - (NSString *)height NSString *myheight = [[NSString alloc] initwithformat:@ %@, %@, meters, centimeters]; [myheight autorelease]; return myheight; Στέλνοντας λοιπόν το µήνυµα autorelease σε ένα αντικείµενο, µαρκάρουµε κατά κάποιον τρόπο το αντικείµενο ώστε να γίνει release 16
25 κάποια στιγµή αργότερα και όχι τώρα. Έτσι το αντικείµενο αυτό µπορεί να χρησιµοποιηθεί και από άλλες µεθόδους ή στιγµιότυπα ελεύθερα αρκεί όλοι να τηρούν τους κανονές του retain και release. Το πότε θα γίνει release ένα αντικείµενο είναι πλέον αρµοδιότητα του autorelease pool. Το autorelease pool είναι σαν να έχουµε µία πισίνα όπως αναφέρει και το όνοµά του η οποία γεµίζει µε αντικείµενα τα οποία έχουν µαρκαριστεί να γίνουν autorelease. Όταν τελειώσουν οι διεργασίες που χρησιµοποιούν τα αντικείµενα αυτά, η πισίνα αδειάζει στέλνοντας το µήνυµα release σε ότι περιέχει. Η ιδέα του autorelease pool χρησιµοποιείται ευρέως και µάλιστα είναι και το απ τα πρώτα πράγµατα που υλοποιούνται αυτοµάτως όταν δηµιουργούµε µία καινούρια εφαρµογή. Η κεντρική θα λέγαµε πισίνα της εφαρµογής βρίσκεται στο αρχείο main.m και αποτελείται από τον εξής κώδικα: int main(int argc, char *argv[]) NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retval = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retval; Automatic Reference Counting ARC Γενικά Με την ανάθµιση της πλατφόρµας ios στην έκδοση 5.0, έγινε διαθέσιµη η δυνατότητα της Αυτόµατης Διαχείρισης Μνήµης (ή Automatic Reference Counting ARC), η οποία στη συνέχεια υπήρχε ως εναλλακτική επιλογή στις εκδόσεις 5 και 6, ενώ πλέον έγινε υποχρεωτική µε την αναβάθµιση στην έκδοση 7.0. Με την αυτόµατη διαχείριση µνήµης, ο προγραµµατιστής είναι πλέον υπεύθυνος µόνο για την δέσµευση της µνήµης για τα αντικείµενα που θα χρησιµοποιήσει. Την αποδέσµευση την αναλαµβάνει εξ ολοκλήρου το σύστηµα. Πιο συγκεκριµένα, η δυνατότητα του ARC µεταφέρει την αναγκαιότητα για την παρακολούθηση και διαχείρηση του retain count των χρησιµοποιούµενων αντικειµένων από τον προγραµµατιστή στον compiler. Ενώ λοιπόν, πριν το ARC, ο προγραµµατιστής θα έστελνε τις εντολές retain και release στα αντίκειµενα του ώστε να αποφύγει την 17
26 απρόοπτη καταστροφή τους ή να τα µαρκάρει προς καταστροφή, πλέον µε το ARC σύστηµα, o compiler το κάνει αυτόµατα εξετάζοντας τον πηγαίο κώδικα και προσθέτοντας ο ίδιος τις εντολές αυτές στον συντιθέµενο κώδικα (compiled code). Μια σηµαντική λεπτοµέρεια εδώ είναι ότι το ARC δεν είναι το ίδιο µε τη «συλλογή αχρήστων» (garbage collection) που µπορούµε να βρούµε σε άλλες γλώσσες προγραµµατισµού όπως η Java, καθώς δεν υπάρχει κάποια background δραστηριότητα που να εξετάζει και να αποδεσµεύει την µνήµη των αχρείαστων πλέον αντικειµένων. Η συγκεκριµένη αναβάθµιση (προσθήκη του ARC) χαρακτηρίστηκε ως «η πρώτη µεγάλη αναβάθµιση στην γλώσσα Objective-C από την δεκαετία του 80» Κανόνες χρήσης ARC Απαγορεύεται η χρήση των εντολών retain, release, retaincount, autorelease και dealloc απο τον προγραµµατιστή. Ο compiler αυτοµάτως εισάγει τις κατάλληλες εντολές όπου χρειάζεται κατά την διάρκεια της σύνθεσης (compiling) του προγράµµατος. Παράδειγµα: Xωρίς ARC: - (void)dealloc [[NSNotificationCenter defaultcenter] removeobserver:self]; [super dealloc]; Με ARC: - (void)dealloc [[NSNotificationCenter defaultcenter] removeobserver:self]; // Δεν γίνεται κλήση της [super dealloc]. Απαγορεύεται. Απαγορεύεται η µετατροπή (cast) αναµέσα σε αντικείµενα τύπου id και δείκτες τύπου void *. Αυτό συµπεριλαµβάνει τις µετατροπές ανάµεσα σε αντικείµενα που προέρχονται από το Foundation Framework και από το Core Foundation Framework. 18
27 Σ αυτή την περίπτωση θα πρέπει να χρησιµοποιηθούν ειδικοί τύποι µετατροπέων (κλήσεις σε ειδικά προσαρµοσµένες συναρτήσεις) οι οποίες θα δώσουν περισσότερα στοιχεία στον compiler για την αναµενόµενη διάρκεια ζωής του αντικειµένου. Παράδειγµα: Χωρίς ARC - (NSString *)givemeastring CFStringRef mystring = [self somemethodthatcreatesacfstring]; NSString *newstring = (NSString *)mystring; return [newstring autorelease]; Με ARC και µετατροπή: - (NSString *)givemeastring CFStringRef mystring = [self somemethodthatcreatesacfstring]; // retain count is 1 NSString *newstring = ( bridge_transfer NSString *)mystring; // the ownership has now been transferred into ARC return newstring; Με ARC και κλήση συνάρτησης: - (NSString *)givemeastring CFStringRef mystring = [self somemethodthatcreatesacfstring]; // retain count is 1 NSString *newstring = (NSString *)CFBridgingRelease(myString); // the ownership has now been transferred into ARC return newstring; Απαγορεύεται η χρήση NSAutoreleasePool αντικειµένων. Αντί αυτών θα πρέπει να χρησιµοποιείται η 19
28 Παραδειγµα: Χωρίς ARC: - (void)loopthrougharray:(nsarray *)array NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; for (id object in array) // create a lot of temporary objects [pool drain]; Με ARC: - (void)loopthrougharray:(nsarray for (id object in array) // create a lot of temporary objects Απογορεύεται κλήση των συναρτήσεων NSAllocateObject και NSDeallocateObject Απογορεύεται η χρήση δεικτών αντικειµένων σε δοµές γλώσσας C Απαγορεύεται η χρήση ζωνών µνήµης (NSZone). Για την σωστή συνεργασίας ARC και µη-arc κώδικα, µπορεί να χρησιµοποιηθεί η εντολή «copy» της µεταβλητής ή στην µέθοδο Δηλώσεις ιδιοτήτων µε και χωρίς ARC Χωρίς ARC retain assign copy Με ARC strong weak copy 20
29 Μετατρoπή κώδικα σε ARC Από την έκδοση Xcode 4.2 και µετά υπάρχει τρόπος µετατροπής του non-arc κώδικά µας σε ARC µέσω εντολής στο µενού επιλογών του προγράµµατος Xcode. Παρόλο που το πρόγραµµα θα µετατρέψει την πλειοψηφία του κώδικα, κάποια σύνθετα κοµµάτια χρειάζονται την παρέµβαση του χρήστη για την τροποποίηση αυτού. Σ αυτήν την περίπτωση, το πρόγραµµα θα εµφανίσει σχετικές ειδοποιήσεις στον προγραµµατιστή. Απ την στιγµή που έχει επιλεγεί η δυνατότητα ARC, το πρόγραµµα δεν πρόκειται να τρέξει αν δεν συναντώνται όλοι παραπάνω κανόνες. Για τον λόγο αυτό χρήζει ιδιαίτερης προσοχής το που και πως θα κάνουµε την µετατροπή Προβλήµατα του ARC Παρόλο που το ARC αποτελεί µια δραµατική βελτίωση στον κύκλο διαχείρισης µνήµης, υπάρχουν περιπτώσεις που δηµιουργεί προβλήµατα αντί να λύνει. Ιδιαίτερα στην περίπτωση που πρέπει να συνεργαστεί κώδικας γραµµένος σε µη-arc περιβάλλον µε κώδικα σε ARC περιβάλλον. Ευτυχώς υπάρχουν λύσεις όπως µαρκάροντας ποιός κώδικας πρέπει να συνδεθεί µε ποιά επιλογή αλλά δεν αποτελούν τον βέλτιστο τρόπο. Ακόµα, κατά την µετατροπή µη-arc κώδικα σε ΑRC, υπάρχουν αρκετά κενά που πρέπει να καλυφθούν ώστε να πληρούνται οι κανόνες που αναφέρθηκαν, οπότε σε ορισµένες περιπτώσεις η µετατροπή του καταλήγει ασύµφορη Η προγραµµατιστική σουίτα Xcode Γενικά Το Χcode είναι ένα ολοκληρωµένο προγραµµατιστικό περιβάλλον το οποίο περιέχει ένα σύνολο από εργαλεία για την ανάπτυξη εφαρµογών σε περιβάλλοντα Macintosh και ios. Η άναπτυξη της παρούσας εφαρµογής έγινε στην έκδοση Βασική Διεπαφή Η βασική διεπαφή της εφαρµογής Xcode αποτελείται από 4 κοµµάτια: Τον Navigator, όπου εµφανίζονται όλα τα αρχεία που υπάρχουν µέσα στο project µας 21
30 Τον Editor, όπου γίνεται η συγγραφή του κώδικα και η σχεδίαση του γραφικού περιβάλλοντος της εφαρµογής µας Των Utilities, όπου µπορούµε να αλληλεπιδράσουµε µε λεπτοµέρειες και ιδιότητες των στοιχείων του αναπτυσσόµενου γραφικού περιβάλλοντος αλλά και να αναζητήσουµε βοήθεια για οποιοδήποτε εντολή ή κοµµάτι κώδικα µέσω των εγκατεστηµένων documentation Και της Toolbar η οποία εµφανίζει την τρέχουσα κατάσταση του προγράµµατος µας ανά πάσα στιγµή και δίνει άµεση πρόσβαση σε βασικές λειτουργίες όπως εκκίνηση/διακοπή εκτέλεσης της εφαρµογής µας στον simulator ή στην συσκευή Οι περιοχές αυτές διακρίνονται στην εικόνα που ακολουθεί: Πρότυπα Ξεκινώντας την δηµιουργία ενός νέου project, δίνεται η δυνατότητα να επιλέξουµε ανάµεσα σε κάποια έτοιµα πρότυπα τα οποία περιέχουν έτοιµο κώδικα και γραφική διεπαφή για ορισµένα βασικά στοιχεία της 22
31 εφαρµογής. Εναλλακτικά µπορούµε να ξεκινήσουµε από το µηδέν (επιλέγοντας Empty Application). Τα διαθέσιµα πρότυπα στην τρέχουσα έκδοση του Xcode είναι: Master-Detail Application OpenGL Game Page-Based Application Single View Application Tabbed Application Utility Application Empty Application SpriteKit Game Πιο συγκεκριµένα: Το Master-Detail Application παρέχει έτοιµες υποδοµές για προβολή λίστας αντικειµένων όπου µε την επιλογή ενός προχωρεί στην εµφάνιση λεπτοµερειών. To πρότυπο OpenGL Game δίνει τα βασικά για να ξεκινήσουµε την ανάπτυξη παιχνιδιού βασισµένο στην τεχνολογία OpenGL. Το Page-Based Application δηµιουργεί µια σειρά από σελίδες έτοιµες για να γεµίσουν µε περιεχόµενο. Το Single View Application αποτελεί το πιο απλό πρότυπο και µας δίνει ένα view (οθόνη) µαζί µε έναν ελεγκτή για να ξεκινήσουµε την εφαρµογή µας. Το Tabbed Application δηµιουργεί µια σειρά από καρτέλες όπου κατά την επιλογή της καθεµίας εµφανίζεται αντίστοιχα συνδεµένη πληροφορία. Το Utility Application είναι ουσιαστικά το Single View πρότυπο µε ένα extra view και στηρίζεται στην ιδέα της ανάπτυξης κάποιου εργαλείου όπου δεν χρειάζονται πολλά views (οθόνες). To Empty Application είναι τα απολύτως απαραίτητα. Εδώ είναι που δηµιουργούµε τα πάντα απ το µηδέν. Τέλος, το πρότυπο SpriteKit Game για την ανάπτυξη SpriteKit παιχνιδιού. 23
32 Τα πρότυπα αυτά φαίνονται στην παρακάτω εικόνα: Xib και Storyboards Τα.xib και τα.storyboard αρχεία είναι τύποι πηγαίων αρχείων τα οποία χρησιµοποιούνται για την σχεδίαση και αναπαράσταση των γραφικών στοιχείων διεπαφής χρήστη σε OSX και ios εφαρµογές (αν και µπορεί να περιλαµβάνουν και µη εµφανή αλληλεπιδρώντα στοιχεία). Σχεδιάζονται στο εργαλείο Interface Builder το οποίο πλέον είναι ενσωµατωµένο στην εφαρµογή Xcode. Και οι δύο τύποι αρχείων λειτουργούν µε παρόµοια νοοτροπία αλλά διαφέρουν στον τύπο (καθώς το.storyboard είναι ανεπτυγµένο πρόσφατα βάσει νέας τεχνολογίας) και έχουν λίγο διαφορετικές δυνατότητες. Τα.xib αρχεία υποστηρίζονται και σε περιβάλλον Mac OS X και σε ios και ενώ µπορούν να περιέχουν µία πληθώρα διαφορετικών στοιχείων, είναι κοινή πρακτική καλού σχεδιασµού να περιέχουν µόνο ένα view κάθε φορά. Τα.storyboard αρχεία είναι ένας καινούριος τύπος αρχείου και αυτή τη στιγµή υποστηρίζεται µόνο στο περιβάλλον ios. Επεκτείνουν την ιδέα των.xib αρχείων δίνοντας την δυνατότητα να περιλαµβάνουν πολλά 24
33 views (σε πολλές περιπτώσεις όλα τα views της εφαρµογής) καθώς και πληροφορίες για το πως η εφαρµογή θα εναλλάσεται µεταξύ των διάφορων views. Αυτό αποτελεί και την µεγαλύτερη ευκολία σε σχέση µε τα.xib στα οποία οι µεταβάσεις από το ένα view στο άλλο απαιτούν πολύ περισσότερο κόπο και κώδικα. Και στους δύο τύπους, για τον σχεδιασµό του γραφικού περιβάλλοντος πραγµατοποιούµε τις όποιες προσθήκες και αλλαγές µε τη γνωστή λειτουργία Drag n Drop. Φυσικά µπορούµε να δηµιουργήσουµε και χειροκίνητα απ το µηδέν κάθε γραφικό στοιχείο γράφοντας κώδικα αλλά η διαδικασία αυτή είναι πιο χρονοβόρα και εισάγουµε «περιττό» κώδικα. Μετά την σχεδίαση του γραφικού περιβάλλοντος, το µόνο που µένει να κάνουµε είναι οι σωστές διασυνδέσεις µε τις µεθόδους και τις µεταβλητές στον κώδικα µας H αρχή του Model-View-Controller (MVC) Στα πλαίσια του προγραµµατισµού για φορητές συσκευές ios, είναι καλό να ακολουθείται το µοντέλο Model-View-Controller (MVC) το οποίο ουσιαστικά διαχωρίζει σε τρεις διαφορετικούς τοµείς/ αρµοδιότητες την εφαρµογή. Αυτοί είναι: Model. To µοντέλο είναι υπεύθυνο για τα δεδοµένα που παρέχονται στην εφαρµογή σε οποιοδήποτε σηµείο της. Αυτό θα πρέπει να είναι συµπαγές και να µην διατηρεί καµία εξάρτηση από τον τρόπο παρουσίασης των. Ένα καλά δοµηµένο µοντέλο µπορεί εµφανιστεί χωρίς προβλήµατα µέσα από διαφορετικές διεπαφές. Το µοντέλο συνηθίζεται να είναι κάποια βάση δεδοµένων (SQLite ή CoreData). View. Η εικόνα δηλαδή αυτό που βλέπει ο χρήστης είναι υπεύθυνη για την προβολή και µόνο των δεδοµένων και των αλλαγών στον χρήστη. Δεν θα πρέπει να αποθηκεύει και να εξαρτάται από τα δεδοµένα που εµφανίζει σε οποιοδήποτε κοµµάτι της. Ο χρήστης θα πρέπει να είναι ικανός να αλληλεπιδράσει µε τα στοιχεία της και κατ επέκταση τα δεδοµένα αλλά όχι άµεσα. Ακόµη, ιδανικό θα ήταν να µπορεί να επαναχρησιµοποιηθεί και να προσαρµόζεται στις ανάγκες του χρήστη. Controller. Ο ελεγκτής είναι υπεύθυνος για όλες τις ενδιάµεσες λειτουργίες µεταξύ του µοντέλου και της εικόνας. Αναλαµβάνει την ενηµέρωση της εικόνας για τις όποιες αλλαγές στο µοντέλο δεδοµένων αλλά και το ανάποδο, δηλαδή ενηµέρωση των δεδοµένων βάσει των όποιων αλλαγών έχει πραγµατοποιήσει ο χρήστης διαµέσου της εικόνας. Πρακτικά είναι το κοµµάτι µε το οποίο συνήθως ασχολούµαστε περισσότερο καθώς αυτός περιέχει 25
34 τον κώδικα της λογικής που θέλουµε να υλοποιήσουµε. Θα λέγαµε ότι είναι η καρδιά της εφαρµογής µας Υπόλοιπες Γνώσεις Άλλες γλώσσες προγραµµατισµού Άλλες γνώσεις που χρειάστηκαν για να έρθει εις πέρας η υλοποίηση αυτής της εφαρµογής ήταν: HTML H γλώσσα HTML (HyperText Markup Language) είναι η πιο γνωστή γλώσσα µορφορποίησης κειµένου και πάνω σ αυτήν χτίζονται οι ιστοσελίδες του παγκόσµιου ιστού. Προκειµένου να δώσουµε στο κείµενο την µορφή που θέλουµε ώστε να το προσαρµόσουµε στις ανάγκες µας, χρησιµοποιήθηκε αρκετά η HMTL γλώσσα. JavaScript Η JavaScript είναι µια δυναµική γλώσσα σεναρίων µε σύνταξη επηρεασµένη από την C. Βρίσκει χρήση κατά κύριο λόγο σε ιστοσελίδες αλλά και σε εφαρµογές εκτός αυτών. Η JavaScript προσδίδει λειτουργικότητα στην εκάστωτε εφαρµογή και κάνει εφικτή την αλληλεπίδραση µε τον χρήστη. Ένα παράδειγµα χρήσης αυτής είναι η µεγέθυνση/σµίκρυνση του κειµένου σε µια ιστοσελίδα Πανόραµα Γενικά To πανόραµα προέρχεται από τις ελληνικές λέξεις πᾶν και ὅραµα και είναι µία ευρυγώνια προβολή ή αναπαράσταση ενός φυσικού χώρου. Βρίσκει απήχηση σε πολλούς τοµείς όπως ζωγραφική, σχέδιο, φωτογραφία, ταινίες, σεισµικές εικόνες και τρισδιάστατα µοντέλα. Παλαιότερα, η πανοραµική ζωγραφική ήταν ένας πολύ δηµοφιλής τρόπος για την αναπαράσταση τοπίων και ιστορικών δρωµένων. Αργότερα, ήρθε να την αντικαταστήσει η πανοραµική φωτογραφία. Οι φωτογράφοι της εποχής συνέθεταν πολλαπλές φωτογραφίες µίας εικόνας σε µία ευρείας γωνίας. Η ψηφιακή φωτογραφία στα τέλη του 20 ου αιώνα απλοποίησε ιδιαίτερα την διαδικασία η οποία πλέον είναι γνωστή ως ράψιµο εικόνας (image stitching). Τέτοιες εικόνες µπορούν να χρησιµοποιηθούν σε µορφές εικονικής πραγµατικότητας 26
35 εκµεταλλευόµενοι τεχνολογίες όπως το Flash, Java, Javascript και το QuickTime VR της Apple. Για την δηµιουργία ενός πανοράµατος πλέον αρκεί µία περιστρεφόµενη κάµερα (ακόµα και τα σύγχρονα smartphones έχουν την δυνατότητα να το κάνουν) αλλά για την δηµιουργία ενός σφαιρικού πανοράµατος 360 ο είναι απαραίτητη η διαδικασία του image stitching. Πανοραµικές ταινίες 360 ο έχουν δηµιουργηθεί για ειδικά σχεδιασµένους χώρους όπως θεµατικά πάρκα, µουσεία κτλ όπως αυτό αυτό της Disney Τύποι Πανοραµικών Φωτογραφιών Υπάρχουν διάφοροι τύποι πανοραµικών φωτογραφιών και αυτοί είναι: Επίπεδο Αυτό το είδος προορίζεται για προβολή χωρίς διόρθωση προοπτικής. Κυλινδρικό Αυτά τα πανοράµατα προβάλλονται σαν να βρισκόµαστε στο κέντρο ενός κυλίνδρου και για να το δούµε όλα θα πρέπει να περιστραφούµε γύρω από τον εαυτό µας. Αν δούµε την εικόνα ως επίπεδο θα παρατηρήσουµε καµπύλες στον οριζόντιο άξονα. Σφαιρικό Τα σφαιρικά πανοράµατα αναπαρίστανται από φωτογραφίες που βρίσκονται σε φορµά equirectangular, το οποίο αναπαριστά ακριβώς 360 ο στον οριζόντιο άξονα και 180 ο στον κάθετο. Αυτά τα πανοράµατα προβάλλονται σαν να είµαστε στο κέντρο µίας σφαίρας. Δηµιουργούνται είτε από πολλές φωτογραφίες τραβηγµένες ανά 10 ο και έπειτα µε συρραφή αυτών, είτε µε ειδικού 27
36 τύπου φακού ο οποίος έχει οπτικό πεδίο (Field of View - FOV) 180 ο µε τέσσερις φωτογραφίες ανά 90 ο και συρραφή αυτών. Κυβικό Τα κυβικά πανοράµατα δηµιουργούνται από 6 φωτογραφίες (πάνω, κάτω και τέσσερις γύρω γύρω ανά γωνία 90 ο ) οι οποίες είναι επίπεδες εικόνες (το 1 ο είδος δηλαδή) και γι αυτό τον λόγο είναι και πιο εύκολη η επεξεργασία του σε σχέση µε το κυλινδρικό ή το σφαιρικό. Κατά τ άλλα η οπτική του είναι σαν αυτή του σφαιρικού. Η δηµιουργία των εικόνων πανοραµάτων που χρησιµοποιήθηκαν στην εφαρµογή, έγινε µέσω χρήσης του ειδικού τύπου φακού fish-eye lens της εταιρίας Pixeet για την λήψη των φωτογραφιών και της παρέχοµενης εφαρµογής της ίδιας εταιρίας για την συρραφή αυτών. Έπειτα οι εικόνες εξήχθησαν σε µορφή equirectangular και µέσω του προγράµµατος Photoshop σε σταθερό υπολογιστή, έγιναν κάποιες εµφανισιακές αλλαγές σε αυτές. 28
37 ΚΕΦΑΛΑΙΟ 3 Η ΕΦΑΡΜΟΓΗ H ανάπτυξη της εφαρµογής ξεκίνησε µε βάση το πρότυπο Single View Application το οποίο παρέχει έναν βασικό ελεγκτή και ένα storyboard Τo κύριο µενού της εφαρµογής: Το κύριο µενού της εφαρµογής αποτελείται από τους εξής controllers και τα αντίστοιχα views: MainViewController ToMET PlacesToSee Navigation CalendarView Contact Ακολουθεί ανάλυση αυτών: Αρχική Οθόνη MainViewController O MainViewController περιέχει το αρχικό µενού της εφαρµογής, δηλαδή αυτό που εµφανίζεται στον χρήστη όταν ανοίγει την εφαρµογή. Το αρχικό µενού λοιπόν περιέχει κουµπιά που οδηγούν στα αντίστοιχα views και περιέχουν το αντίστοιχο θέµα όπως τις πληροφορίες για το Μουσείο, την εικονική ξενάγηση κτλ. Ο MainViewController ενσωµατώθηκε σε ένα NavigationController µέσα στο storyboard. Ο NavigationController είναι ένας από τους βασικούς ελεγκτές που διαχειρίζεται την πλοήγηση στο λειτουργικό ios. Λειτουργεί βάση της λογικής στοίβας, δηλαδή βάζουµε (push) και βγάζουµε (pull) view controllers σε και από µία στοίβα αποτελούµενη από αυτούς. Ο χρήστης βλέπει τον view controller που είναι στην κορυφή της στοίβας κάθε φορά. Αντίστοιχα, τα κουµπιά που ανήκουν στο view του MainViewController, συνδέθηκαν µε τα αντίστοιχα views που εκπροσωπούν (µέσω του Interface Builder στο storyboard της εφαρµογής) και µε λογική να 29
38 συµµορφώνονται µε τον NavigationController, δηλάδη σε κάθε πάτηµα ενός κουµπιού έχουµε push του αντίστοιχου ViewController πάνω στην στοίβα µας (stack). Όλα αυτά πραγµατοποιήθηκαν χωρίς τη συγγραφή κώδικα µε απλά drag n drop και να ένα από τα µεγάλα προτερήµατα του storyboard έναντι των.xib αρχείων. Βέβαια, για να κάνουµε λίγο πιο ζωντανό το περιβάλλον θεωρήθηκε καλή ιδέα να προστεθεί ένα σύντοµο animation στα κουµπιά κατά την πρώτη εκκίνηση της εφαρµογής. Αυτό επετεύχθει προσθέτοντας αναφορές στα κουµπιά της εφαρµογής στο header file του MainViewController, συνδέοντας τα κουµπιά µε τον controller και γράφοντας για το καθένα ένα µικρό κοµµάτι κώδικα που πραγµατοποιεί το animation. Ο κώδικας αυτός έχει την µορφή: Δήλωση κουµπιών στο header MainViewController : UIViewController IBOutlet UIButton *firstbutton, *secondbutton, *thirdbutton, *fourthbutton, (nonatomic, retain) IBOutlet UIButton *firstbutton, *secondbutton, *thirdbutton, *fourthbutton, 30
39 Υλοποίηση animation block στο implementation file: [UIView beginanimations:nil context:nil]; [UIView setanimationduration:0.4]; [UIView setanimationdelegate:self]; [UIView setanimationtransition:uiviewanimationtransitionflipfromright forview:self.view cache:yes]; firstbutton.frame = CGRectMake(0, firstbutton.frame.origin.y, firstbutton.frame.size.width, firstbutton.frame.size.height); [UIView commitanimations]; Αυτό το κοµµάτι ονοµάζεται animation block και ορίζει µέσω κάποιων παραµέτρων, όπως την διάρκεια του animation (animationduration) και τον τύπο µετάβασης (animationtransition), τον τρόπο και την αλλαγή που θέλουµε να πραγµατοποιήσουµε. Εδώ αυτό που θέλουµε να κάνουµε είναι δηµιουργήσουµε την ψευδέσθηση ότι τα κουµπιά κινούνται από τα αριστερά προς τα δεξιά, οπότε το µόνο που έχουµε να κάνουµε είναι να ορίσουµε την αρχική θέση αυτών στον Inteface Builder (την παράµετρο frame.origin.x) κάπου αριστερά έξω από τα όρια της οθόνης και την τελική θέση αυτών στο animation block κάπου δεξιά µέσα στα όρια της οθόνης. Τα υπόλοιπα τα αναλαµβάνει το block και κατ επέκταση το σχετικό framework (CoreAnimation) Το Μουσείο ΤοΜΕΤ Ο controller αυτός υλοποιεί µια λίστα δίνοντας πρόσβαση σε πληροφορίες σχετικά µε το Μουσείο Επιστηµών και Τεχνολογίας. Η υλοποίηση της λίστας γίνεται µε χρήση του UITableView αντικειµένου της βιβλιοθήκης του Xcode. Εδώ απαιτείται η συγγραφή κώδικα και συγκεκριµένα κάποιων µεθόδων ώστε η λίστα να είναι λειτουργική και να δείχνει τα επιθυµητά. Για να πραγµατοποιηθεί αυτό λοιπόν πρέπει να υλοποιήσουµε τις εξής µεθόδους: - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableview; - (NSInteger)tableView:(UITableView *)tableview numberofrowsinsection:(nsinteger)section; - (UITableViewCell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath; 31
40 Η πρώτη µέθοδος επιστρέφει τον αριθµό των ενοτήτων στις οποίες θα χωρίζεται η λίστα. Για την εφαρµογή µας είναι µία οπότε επιστρέφεται ο αριθµός 1. Η δεύτερη µέθοδος επιστρέφει τον αριθµό των κελιών που θα περιέχονται σε κάθε ενότητα. Για την εφαρµογή µας και για την µία ενότητα θα είναι εφτά όσα και τα διαθέσιµα θέµατα προς προβολή σχετικά µε το Μουσείο, οπότε επιστρέφεται ο αριθµός 7. Η τρίτη µέθοδος επιστρέφει το αντίστοιχο κελί της λίστας µε τα όποια στοιχεία της έχουµε ορίσει να περιλαµβάνει. Στην συγκεκριµένη περίπτωση επιστρέφει κελί τύπου METCell το οποίο είναι subclass της default κλάσης UITableViewCell που είναι υπεύθυνη για την προβολή περιεχοµένου σε κελιά πίνακα. Με την υποκλάση που δηµιουργήσαµε όµως έχουµε περισσότερες επιλογές µορφοποίησης και τροποποίησης της προβολής. Το METCell λοιπόν αποτελείται από τα εξής στοιχεία: Μία εικόνα τοποθέτηµενη στα αριστερά του κελιού και έναν τίτλο που ακολουθεί αµέσως µετά την εικόνα. Τα αντίκειµενα αυτά που αντιστοιχούν στα αντίκειµενα UIImageView και UILabel της βιβλιοθήκης τοποθετήθηκαν και συνδέθηκαν γραφικά στον Intefacer Builder ενώ αρχικοποιούνται µέσω της τρίτης µεθόδου. - (UITableViewCell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath static NSString *CellIdentifier METCell *cell = [tableview dequeuereusablecellwithidentifier:cellidentifier forindexpath:indexpath]; // Configure the cell... if (indexpath.row==0) cell.titlelabel.text cell.imageview.image = [UIImage imagenamed:@"target.png"]; else if (indexpath.row==1) cell.titlelabel.text cell.imageview.image = [UIImage imagenamed:@"activities.png"]; return cell; Επίσης µία ακόµα µέθοδος που υλοποιείται είναι η: 32
41 -(void)prepareforsegue:(uistoryboardsegue *)segue sender: (id)sender; η οποία εκτελεί τον κώδικα που περιέχει ακριβώς πριν πραγµατοποιήσει την µετάβαση στο view στο οποίο έχει δωθεί εντολή να µεταβεί. Πιο συγκεκριµένα, ο χρήστης πατώντας πάνω σε ένα από τα διαθέσιµα κελιά, δηµιουργείται δείκτης προς το view METDetailsView που πρόκειται να µεταβεί η εφαρµογή και ακολουθεί ανάθεση του ονόµατος του κελιού σε τοπική του µεταβλητή. Έπειτα πραγµατοποιείται η µετάβαση. - (void)prepareforsegue:(uistoryboardsegue *)segue sender: (id)sender // Get the new view controller using [segue destinationviewcontroller]. METCell *selectedcell = (METCell *)sender; METDetailsView *thesegue = [segue destinationviewcontroller]; // Pass the selected object to the new view controller. thesegue.navititle = selectedcell.titlelabel.text; METDetailsView Το view αυτό εµφανίζει περισσότερες πληροφορίες για το επιλέγµενο θέµα της προηγούµενης οθόνης. Περιέχει ένα αντικείµενο τύπου UIWebView το οποίο χρησιµοποιείται για την προβολή web περιεχοµένου όπως HTML σελίδες και κουµπιά αρµόδια για την σµίκρυνση/µεγέθυνση του προβαλλόµενου κειµένου. Κατά την µετάβαση στο view αυτό, ο controller του διαβάζει την τοπική µεταβλήτη navititle όπου περιέχεται το όνοµα του κελιού που επέλεξε ο χρήστης προηγουµένως και έπειτα φορτώνει προς προβολή το αντίστοιχο HTML αρχείο που βρίσκεται αποθηκευµένο ήδη µέσα στην εφαρµογή. Ακόµα, φροντίζει και για την σωστή κωδικοποίηση του αρχείου (UTF8) ώστε να εµφανίζεται σωστά, µέσω µεθόδου που ορίζει το encoding προς χρήση. Η εντολή που πραγµατοποιεί το παραπάνω δίνεται εδώ ως: 33
42 self.navigationitem.title = navititle; NSString *htmlfile; if ([navititle isequaltostring:@"στόχοι"]) htmlfile = [[NSBundle mainbundle] pathforresource:@"stoxoi" oftype:@"html"]; else if ([navititle isequaltostring:@"δραστηριότητες"]) htmlfile = [[NSBundle mainbundle] pathforresource:@"drasthriothtes" oftype:@"html"]; NSString* htmlstring = [NSString stringwithcontentsoffile:htmlfile encoding:nsutf8stringencoding error:nil]; [webview loadhtmlstring:htmlstring baseurl:nil]; Το htmlfile είναι τύπου NSString και κρατάει την διαδροµή του αρχείου προς προβολή. Ο λόγος που επιλέχτηκε η προβολή HTML αρχείων και κατ επέκταση χρήση UIWebView, αντί για απλό κείµενο και UITextView το οποίο παρέχει απλή προβολή κειµένου, είναι γιατί τα κείµενα περιέχουν αρκετά είδη µορφοποιήσεων όπως underline, bold, bullets & lists. Υπάρχει και η δυνατότητα χρήσης attributedstrings όπου επιτρέπονται µορφοποιήσεις σαν τις προαναφερθείσες αλλά είναι τροµερά χρονοβόρα όταν µιλάµε για την δηµιουργία ολόκληρων κειµένων. Εκτός αυτού χρησιµοποιώντας UIWebView έχουµε και την δυνατότητα προσθήκης έξτρα λειτουργικότητας µέσω javascript, πράγµα και το οποίο έγινε στην υλοποίηση της αλλαγή µεγέθους γραµµατοσειράς του κειµένου. H µέθοδος αλλαγής δίνεται εδώ: -(IBAction)segmentedControlIndexChanged:(id)sender UISegmentedControl *tempseg = (UISegmentedControl *)sender; 34 if (tempseg.selectedsegmentindex == 0) fontsize = (fontsize > 50)? fontsize -5 : fontsize;
43 else fontsize = (fontsize < 160)? fontsize +5 : fontsize; NSLog(@"current font size: %d",fontsize); NSString *jsstring = [[NSString alloc] initwithformat:@"document.getelementsbytagname('body') [0].style.webkitTextSizeAdjust= '%d%%'", fontsize]; [webview stringbyevaluatingjavascriptfromstring:jsstring]; όπου το fontsize είναι int µεταβλητή που η τιµή της διαµορφώνεται µε τα κουµπιά σµίκρυνσης/µεγέθυνσης. Τέλος πρέπει να αναφερθεί ότι επιλέχθηκε τα HTML αρχεία, που περιέχουν τις πληροφορίες, να είναι τοπικά αποθηκευµένα µέσα στην εφαρµογή καθώς δεν επιδέχονται συχνής ενηµέρωσης και είναι µικρά σε µέγεθος ως αρχεία. Σχεδίαση στο storyboard: 35
44 Τι µπορώ να δω στο Μ.Ε.Τ PlacesToSee To view αυτό περιέχει µία λίστα µε κελιά που περιέχουν το όνοµα και την προεπισκόπηση του κάθε διαθέσιµου χώρου προς εικονική ξενάγηση. Η δηµιουργία της λίστας γίνεται µε τις ίδιες µεθόδους και παρόµοια λογική που αναφέραµε και παραπάνω, δηλαδή: - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableview; - (NSInteger)tableView:(UITableView *)tableview numberofrowsinsection:(nsinteger)section; (UITableViewCell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath; Αυτή τη φορά για την προσαρµογή της λίστας στις δικές µας προτιµήσεις προβολής δηµιουργήθηκε η υποκλάση του UITableViewCell PlacesToSeeCell η οποία περίεχει τίτλο (UILabel) για το όνοµα του χώρου και εικόνα (UIImageView) για την προβολή εικόνας προεπισκόπισης του χώρου. Αυτή τη φορά η διαρρύθµιση έγινε λίγο διαφορετικά τοποθετώντας την εικόνα στο πάνω µέρος του κελιού και δίνοντας της πολύ περισσότερο χώρο ενώ ο τίτλος στο κάτω µέρος και λιγότερο χώρο. Επίσης έγιναν διάφορες παραµετροποιήσεις στις ιδιότητες του UITableView (λίστας) στον Interface Builder, όπως αφαίρεση του background, ώστε να επιτύχουµε ένα πιο όµορφο εµφανισιακά αποτέλεσµα. Το κουµπί Βοήθεια εµφανίζει παράθυρο µε οδηγίες το οποίο προετοιµάζει τον χρήστη για το πως να χειριστεί την εικονική ξενάγηση στην αµέσως επόµενη οθόνη η οποία παρέχεται από τον PanoramaController. H µέθοδος που καλεί είναι η: - (IBAction)showHelp:(id)sender; Τέλος, υλοποιείται και πάλι η µέθοδος -(void)prepareforsegue:(uistoryboardsegue *)segue sender: (id)sender; όπου στα πλαίσια προετοιµασίας για µετάβαση στον PanoramaController δηµιουργούµε δείκτη προς αυτόν και αποθηκεύουµε σε τοπικές του µεταβλητές τα στοιχεία του κελιού που 36
45 έχει επιλεγεί. Συγκεκριµένα, αποθηκεύουµε τον αριθµό του κελιού στην λίστα, το όνοµά του και την εικόνα που παρουσιάζει, καθώς η ίδια θα χρησιµοποιηθεί για προβολή και στο επόµενο view (φυσικά σε µεγαλύτερη ανάλυση) PanoramaController To κοµµάτι αυτό στηρίζεται πάνω στο project του κ. Javier Baez PanoramaGL. Ουσιαστικά είναι µία βιβλιοθήκη και µάλιστα είναι η πρώτη βιβλιοθήκη ανοιχτού κώδικα στον κόσµο που επιτρέπει προβολή πανοραµικών φωτογραφιών σε ios περιβάλλον. Έχει σχεδιαστεί και δοκιµαστεί στις εκδόσεις ios 4 & 5 και γι αυτό η προσαρµογή του στην έκδοση 7 ήταν ένα δύσκολο κοµµάτι. O PanoramaController απαρτίζεται από ένα view όπου εµφανίζεται ένα κοµµάτι του χώρου που έχει επιλεχθεί προς προβολή και διάφορα σήµεια ενδιαφέροντος (Points Of Interest - POIs ή HotSpots) τοποθετηµένα σε επιλεγµένα αντικείµενα του χώρου. Μεταβαίνοντας λοιπόν στο view αυτό, το πρώτα πράγµα που κάνει ο ελεγκτής του είναι να δηµιουργήσει ένα νέο νήµα στο οποίο θα προετοιµάσει το περιεχόµενο προς προβολή. Αυτό το αναλαµβάνει η κλάση PLView, η οποία θα φροντίσει να δηµιουργήσει την εικόνα που θα βλέπει ο χρήστης και να προσαρµόσει τα controls κίνησης. Ξεκινώντας µε κάποιες αρχικοποιήσεις λοιπόν καλείται η µέθοδος: -(void)selectpanorama:(nsinteger)index; - (void)viewdidload [super viewdidload]; MBProgressHUD *hud = [MBProgressHUD showhudaddedto:self.view animated:yes]; hud.labeltext dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_P RIORITY_LOW, 0), ^ plview = (PLView *)self.view; plview.delegate = self; [self selectpanorama:0]; dispatch_async(dispatch_get_main_queue(), ^ [MBProgressHUD hidehudforview:self.view animated:yes]; 37
46 ); ); self.navigationitem.title = [[panoramasarray objectatindex: [selectedpanorama intvalue]]name]; // Do any additional setup after loading the view from its nib. Αλλά πριν προχωρήσουµε, επειδή αναλόγως της επεξεργαστικής ισχύος και µνήµης κάθε συσκευής ενδέχεται να υπάρξει µικρή καθυστέρηση και θέλoντας να ενηµερώσουµε τον χρήστη ότι αυτή τη στιγµή γίνεται επεξεργασία, εµφανίζουµε κατά την διάρκεια της παραπάνω διαδικασίας ένα στιγµιότυπο της κλάσης MBProgressHUD το οποίο περιέχει ένα αντικείµενο τύπου UIActivityIndicator και ένα UILabel µε τίτλο Φόρτωση. To MBProgressHUD είναι ένα open source project του οποίου η χρήση έχει υιοθετηθεί από πληθώρα προγραµµατιστών και εταιριών. Αυτό που κάνει είναι να εµφανίζει διαφόρων τύπων µηνύµατα στον χρήστη µε σκοπό να τον ενηµερώνει ότι κάτι συµβαίνει ή συνέβη στο παρασκήνιο και όλα αυτά µε έναν όµορφο, κατανοητό και απλό τρόπο. Μερικά παραδείγµατα χρήσης του είναι: 38
47 Ο UIActivityIndicator είναι αντικείµενο της βιβλιοθήκης του Xcode το οποίο χρησιµοποιείται µε την ίδια λογική αλλά µε πολυ λιγότερες επιλογές αξιοποίησης. Εµφανίζεται στις 2 πρώτες παραπάνω εικόνες. Προχωρώντας λοιπόν στην µέθοδο -(void)selectpanorama:(nsinteger)index; διαβάζουµε την τιµή του χώρου που έχει επιλεγεί από τον χρήστη και αναθέτουµε την αντίστοιχη εικόνα στην µεταβλητή panorama. Έπειτα αναλόγως µε τον επιλεγέντα χώρο ορίζουµε την θέση των Points Of Interest (POIs), δηλαδή των σηµείων που βρίσκονται σε εκθέµατα που έχουν επιλεγεί ώστε να δίνουν την δυνατότητα παροχής επιπλέον πληροφοριών. Αυτό γίνεται µέσω της κλάσης PLTexture όπου ορίζουµε την εικόνα που θα έχει το POI µέσω της µεθόδου: +(id)texturewithimage:(plimage *)image και έπειτα το ακριβές σηµείο που θα τοποθετηθεί το POI µέσω της κλάσης PLHotspot µέσω της µεθόδου: +(id)hotspotwithid:(long long)identifier texture:(pltexture *)texture atv:(float)atv ath:(float)ath width:(float)width height: (float)height Αφού λοιπόν προσθέσουµε όλα τα POIs, το πανόραµα είναι έτοιµο και έτσι στέλνουµε στο αντικείµενο plview το µήνυµα setpanorama:panorama. Ο πλήρες κώδικας φαίνεται εδώ: -(void)selectpanorama:(nsinteger)index NSObject<PLIPanorama> *panorama = nil; if(index == 0) panorama = [PLSpherical2Panorama panorama]; int therow = [selectedpanorama intvalue]; 39
48 NSString *oldstring = [[panoramasarray objectatindex:therow]filename]; NSString *newstring = [oldstring substringtoindex:[oldstring length]-4]; [(PLSpherical2Panorama *)panorama setimage:[plimage imagewithpath:[[nsbundle mainbundle] pathforresource:newstring oftype:@"jpg"]]]; //Add a hotspot if ([[[panoramasarray objectatindex:[selectedpanorama intvalue]]name] isequaltostring:@"χώρος 1"]) PLTexture *hotspottexture = [PLTexture texturewithimage: [PLImage imagewithpath:[[nsbundle mainbundle] pathforresource:@"hotspot" oftype:@"png"]]]; PLHotspot *hotspot = [PLHotspot hotspotwithid:1 texture:hotspottexture atv:0.5f ath:100.0f width:0.08f height:0.08f]; [panorama addhotspot:hotspot]; hotspottexture = [PLTexture texturewithimage:[plimage imagewithpath:[[nsbundle mainbundle] pathforresource:@"hotspot" oftype:@"png"]]]; hotspot = [PLHotspot hotspotwithid:2 texture:hotspottexture atv:0.5f ath:10.0f width:0.08f height:0.08f]; [panorama addhotspot:hotspot]; hotspottexture = [PLTexture texturewithimage:[plimage imagewithpath:[[nsbundle mainbundle] pathforresource:@"hotspot" oftype:@"png"]]]; hotspot = [PLHotspot hotspotwithid:3 texture:hotspottexture atv:0.5f ath:300.0f width:0.08f height:0.08f]; [panorama addhotspot:hotspot]; else if ([[[panoramasarray objectatindex:[selectedpanorama intvalue]]name] isequaltostring:@"χώρος 2-1"]) PLTexture *hotspottexture = [PLTexture texturewithimage: [PLImage imagewithpath:[[nsbundle mainbundle] pathforresource:@"hotspot" oftype:@"png"]]]; PLHotspot *hotspot = [PLHotspot hotspotwithid:4 texture:hotspottexture atv:0.5f ath:100.0f width:0.08f height:0.08f]; [panorama addhotspot:hotspot]; 40
49 PLTexture *hotspottexture = [PLTexture texturewithimage: [PLImage imagewithpath:[[nsbundle mainbundle] pathforresource:@"trans" oftype:@"png"]]]; PLHotspot *hotspot = [PLHotspot hotspotwithid:999 texture:hotspottexture atv:0.5f ath:100.0f width:0.08f height:0.08f]; [panorama addhotspot:hotspot]; [plview setpanorama:panorama]; Μία άλλη µέθοδος που υλοποιείται είναι η: -(void)view:(uiview<pliview> *)pview didclickhotspot:(plhotspot *)hotspot screenpoint:(cgpoint)point scene3dpoint: (PLPosition)position η οποία δεχόµενη τις παραµέτρους: pview hotspot point position και εφόσον ο αριθµός ID του POI είναι διάφορος του 999 (κατά δική µας σύµβαση) καλείται να πραγµατοποιήσει µετάβαση στο view ObjectDetails µέσω της σύνδεσης µετάβασης στο Storyboard ονόµατι objectdetailssegue. -(void)view:(uiview<pliview> *)pview didclickhotspot:(plhotspot *)hotspot screenpoint:(cgpoint)point scene3dpoint: (PLPosition)position theid = (int)hotspot.identifier; if (hotspot.identifier==999) //do nothing NSLog(@"identified as 999"); else 41
50 [self sender:nil]; Επίσης υλοποιείται και εδώ η µέθοδος: -(void)prepareforsegue:(uistoryboardsegue *)segue sender: (id)sender; στην οποία κατά την µετάβαση στo ObjectDetails view δηµιουργεί ένα δείκτη προς αυτό το αντικείµενο και αποθηκεύει στην τοπική µεταβλητή του theid τον χαρακτηριστικό αριθµό του POI που έχει επιλεγεί. - (void)prepareforsegue:(uistoryboardsegue *)segue sender: (id)sender ObjectDetails *targetvc = (ObjectDetails *)segue.destinationviewcontroller; targetvc.theid = [NSNumber numberwithint:theid]; Τέλος, µιας και η συγκεκριµένη κλάση δεν υποστήριζει ARC, οφείλουµε να συµπεριλάβουµε την µέθοδο: -(void)dealloc; όπου στέλνονται τα µηνύµατα αποδέσµευσης µνήµης ObjectDetails Το view αυτό περιέχει µία εικόνα (αντικείµενο τύπου UIImageView) και ένα αντικείµενο προβολής ιστοσελίδων (UIWebView) και λειτουργεί µε παρόµοια λογική όπως του METDetailsView. Σκοπός του είναι η προβολή περισσότερων λεπτοµερειών για κάποιο από τα εκθέµατα που έχει επιλέξει ο χρήστης στην προηγούµενη οθόνη της εικονικής περιήγησης. 42
51 Έτσι αναλαµβάνοντας ο παρών controller, διαβάζει την τιµή της µεταβλητής theid και αναλόγως τον αριθµό του POI επιλέγει τον τίτλο, την εικόνα και το κείµενο που θα προβάλλει στον χρήστη. Ο χρήστης µπορεί να αλληλεπιδράσει µε το κείµενο χρησιµοποιώντας την λειτουργία της αυξοµείωσης του µεγέθους γραµµατοσειράς του κειµένου µέσω της µεθόδου -(IBAction)segmentedControlIndexChanged:(id)sender; η οποία για να το επιτύχει αυτό χρησιµοποιεί το ακόλουθο µικρό κοµµάτι κώδικα javascript NSString *jsstring = [[NSString alloc] initwithformat:@"document.getelementsbytagname('body') [0].style.webkitTextSizeAdjust= '%d%%'", fontsize]; [webview stringbyevaluatingjavascriptfromstring:jsstring]; 43
52 Πως µπορώ να έρθω στο ΜΕΤ Navigation To view αυτό περιέχει τα εξής αντικείµενα: MKMapView UIToolbars UISegmentedControl Το αντικείµενο MKMapView παρέχει µία ενσωµατωµένη γραφική διεπαφή χάρτη αντίστοιχη µ αυτήν που παρέχεται στην εφαρµογή Maps του λειτουργικού συστήµατος ios 7. Χρησιµοποιείται για την προβολή πληροφοριών χάρτη και για την αλληλεπίδραση του χρήστη µε αυτόν. Δίνει την δυνατότητα εστίασης σε συγκεκριµένο σηµείο µε δοθείσες συντεταγµένες, προσθήκη επισηµειώσεων µε δικό µας περιεχόµενο κτλ. Το αντικείµενο UIToolbar αποτελείται από µία µπάρα η οποία τοποθετείται συνήθως στο πάνω ή κάτω µέρος της οθόνης και χρησιµοποιείται για την προβολή και χρήση χρήσιµων εργαλείων τα οποία αποτελούν στιγµιότυπα της κλάσης UIToolbarItem. Το αντικείµενο UISegmentedControl είναι ένα είδος κουµπιού το οποίο αποτελείται από πολλαπλά τµήµατα απ τα οποία το καθένα λειτουργεί σαν ένα διακριτό κουµπί. Το κάθε τµήµα µπορεί να περιέχει µία µικρή γραµµή κειµένου ή µία εικόνα αλλά όχι και τα δύο ταυτόχρονα. Φορτώνοντας τον συγκεκριµένο controller, η εφαρµογή εµφανίζει παράθυρο το οποίο ρωτάει τον χρήστη αν της δίνει το ελεύθερο να χρησιµοποιήσει την τρέχουσα τοποθεσία του. Αυτό είναι ένα µήνυµα που προκύπτει από το Delegate της εφαρµογής και δηµιουργείται ως αντίδραση στην εκκίνηση του αντικειµένου locationmanager της κλάσης CLLocationManager. Εκκινώντας λοιπόν ο controller δεσµεύει χώρο και αρχικοποιεί το αντικείµενο αυτό ενώ στην συνέχεια του ορίζει τις παραµέτρους distancefilter και desiredaccuracy η οποίες αναφέρονται όπως ορίζει και το όνοµά τους στο φιλτράρισµα της απόστασης κίνησης του χρήστη και στην επιθυµητή ακρίβεια του δέκτη. Φυσικά όσο περισσότερο περιορισµένες είναι αυτές οι τιµές τόσο περισσότερη και συνεχή προσπάθεια καταβάλει ο δέκτης για την ανεύρεση της ακριβής και σωστής τοποθεσίας. Αυτό σηµαίνει µεγιστοποίηση της κατανάλωσης ισχύος και άρα γρηγορότερη εξασθένιση της µπαταρίας. Στην συνέχεια στέλνεται στο αντικείµενο locationmanager το µήνυµα startupdatinglocation το οποίο ξεκινά την συνεχή ενηµέρωση της θέσης του χρήστη. 44
53 - (void)viewdidload [super viewdidload]; locationmanager = [[CLLocationManager alloc] init]; locationmanager.delegate = self; locationmanager.distancefilter = kcldistancefilternone; // whenever we move locationmanager.desiredaccuracy = kcllocationaccuracyhundredmeters; // 100 m [locationmanager startupdatinglocation]; [navigationsegmentedcontrol removeallsegments]; [navigationsegmentedcontrol insertsegmentwithtitle:@"πλοήγηση στο Μ.Ε.Τ" atindex:0 animated:yes]; [navigationsegmentedcontrol addtarget:self action:@selector(buttonpressed:) forcontrolevents:uicontroleventvaluechanged]; Παράλληλα εκτελείται και ο κώδικας που βρίσκεται µέσα στις αγκύλες τις µεθόδου: -(void)viewdidappear:(bool)animated; Συγκεκριµένα, ορίζεται η δοµή δεδοµένων zoomlocation τύπου CLLocationCoordinate2D στην οποία ανατίθενται οι τιµές των συντεταγµένων του Μουσείου, ορίζεται η δοµή viewregion τύπου MKCoordinateRegion η οποία καθορίζει τις παραµέτρους προβολής όπως που να κεντράρει ο χάρτης και πόσο θα είναι το span του οριζόντια και κάθετα και έπειτα στέλνεται στον χάρτη το µήνυµα setregion το οποίο πραγµατοποιεί τις επιθυµητές αλλαγές µε ένα σύντοµο animation. Έπειτα ορίζεται ένας χρονοµετρητής της κλάσης NSTimer ο οποίος µετά από 0.8 seconds καλεί την µέθοδο: -(void)animatepin; η οποία δηµιουργεί ένα αντικείµενο της κλάσης MKAnnotation δηλαδή µία πινέζα µε τις συντεταγµένες του Μουσείου και τοποθετεί την πινέζα πάνω στον χάρτη µε εφέ κίνησης. 45
54 -(void)viewdidappear:(bool)animated CLLocationCoordinate2D zoomlocation; zoomlocation.latitude = ; zoomlocation.longitude= ; MKCoordinateRegion viewregion = MKCoordinateRegionMakeWithDistance(zoomLocation, 0.8*METERS_PER_MILE, 0.9*METERS_PER_MILE); // 3 MKCoordinateRegion adjustedregion = [_mapview regionthatfits:viewregion]; // 4 [_mapview setregion:adjustedregion animated:yes]; [NSTimer scheduledtimerwithtimeinterval:0.8 target:self selector:@selector(animatepin) userinfo:nil repeats:no]; Για την δηµιουργία της προσωποποιηµένης πινέζας καλείται η delegate µέθοδος: -(MKAnnotationView *) mapview:(mkmapview *) mapview viewforannotation:(id) annotation; στην οποία εισάγεται ο χάρτης και το annotation. Στη συνέχεια δηµιουργείται ένα αντικείµενο custompinview της κλάσης MKPinAnnotationView η οποία είναι υποκλάση της MKAnnotation και προσφέρει πολλές δυνατότητες παραµετροποίησης της πινέζας όπως το χρώµα της (pincolor), το αν θα έχει εφέ κίνησης (animatesdrop), το αν θα µπορεί να εµφανίσει περισσότερες πληροφορίες σε συνεφάκι από πάνω της όταν πατηθεί κτλ. Στην περίπτωση µας έχει επιλεχθεί να δωθεί το µωβ χρώµα στην πινέζα, να έχει εφέ κίνησης κατά την τοποθέτησή της στον χάρτη, και να δείχνει συννεφάκι από πάνω της. Πιο συγκεκριµένα έχει προστεθεί τίτλος και ένα κουµπί δεξιά του µε το εικονίδιο του Μουσείου το οποίο όταν πατηθεί καλεί την µέθοδο που εκτελεί την Πλοήγηση στο Μ.Ε.Τ η οποία περιγράφεται παρακάτω. 46
55 - (MKAnnotationView *) mapview:(mkmapview *) mapview viewforannotation:(id ) annotation MKPinAnnotationView *custompinview = [[MKPinAnnotationView alloc] initwithannotation:annotation reuseidentifier:nil]; custompinview.pincolor = MKPinAnnotationColorPurple; custompinview.animatesdrop = YES; custompinview.canshowcallout = YES; UIButton *rightbutton = [UIButton buttonwithtype:uibuttontypecustom]; rightbutton.frame = CGRectMake(0, 0, 35, 35); [rightbutton setbackgroundimage:[uiimage imagenamed:@"meticon.png"] forstate:uicontrolstatenormal]; [rightbutton addtarget:self action:@selector(buttonpressed:) forcontrolevents:uicontroleventtouchdown]; custompinview.rightcalloutaccessoryview = rightbutton; return custompinview; Έπειτα, διαµορφώνονται ορισµένες παράµετροι του πρώτου UISegmentedControl και συγκεκριµένα αφαιρούνται όλα τα segments µε την εντολή removeallsegments, ενώ ορίζεται ένα segment µε τίτλο Πλοήγηση στο Μ.Ε.Τ και του ανατίθεται η µέθοδος buttonpressed:. H µέθοδος αυτή, όταν καλεστεί, εµφανίζει αντικείµενο τύπου UIAlertView (τα γνωστά παράθυρα ειδοποίησης χρήστη) το οποίο ρωτά τον χρήστη αν είναι σίγουρος ότι θέλει να προχωρήσει καθώς θα φύγει από την τρέχουσα εφαρµογή και θα ανοίξει η προεγκατεστηµένη εφαρµογή χαρτών της συσκευής έτσι ώστε να δηµιουργηθεί διαδροµή ανάµεσα στο σηµείο που βρίσκεται ο χρήστης και το Μουσείο Επιστηµών και Τεχνολογίας. Με την απάντηση του χρήστη καλείται η delegate µέθοδος: -(void)alertview:(uialertview *)alertview clickedbuttonatindex: (NSInteger)buttonIndex; η οποία είναι delegate για την κλάση UIAlertView και όπως βλέπουµε σαν εισόδους δέχεται τον δείκτη προς το τρέχον alertview και τον αριθµό του κουµπιού που πάτησε ο χρήστης (µε το µηδέν να είναι συνήθως το κουµπί ακύρωσης αλλά αυτό εξαρτάται από τον αριθµό των κουµπιών). Στην συγκεκριµένη περίπτωση ο χρήστης επιλέγοντας να µην επιτραπεί η εύρεση της τοποθεσίας του, εκτελούνται οι εντολές κάτω από τη συνθήκη: 47
56 if (buttonindex==0) δηλαδή η εφαρµογή δεν κάνει τίποτα, παρά µόνο να κλείσει το παράθυρο ειδοποίησης. Επιλέγοντας Να επιτραπεί όµως εκτελείται ο κώδικας κάτω από την γραµµή else if (buttonindex==1) ο οποίος αρχικά ορίζει µία µεταβλητή coordinate τύπου CLLocationCoordinate2D που ουσιαστικά είναι µία δοµή δεδοµένων η οποία κρατάει τις συντεταγµένες που του δίνουµε (στην περίπτωση αυτή τις συντεταγµένες του Μουσείου). Έπειτα ορίζεται αντικείµενο τύπου MKPlaceMark ονόµατι placemark το οποίο αποθηκεύει δεδοµένα όπως χώρα, πολιτεία, πόλη και οδό σύµφωνα µε τις συνταγµένες που του δίνονται. Εν συνεχεία δεσµεύουµε χώρο για ένα αντικείµενο MKMapItem το οποίο θα κρατήσει τα παραπάνω δεδοµένα και θα του προσθέσουµε και το όνοµα M.E.T. Οι εφαρµογές που δηµιουργούνται, χρησιµοποιούν αυτην την κλάση για τον διαµοιρασµό στοιχείων µε την προεγκατεστηµένη εφαρµογή χαρτών. Τέλος, εκτελώντας τον κώδικα: NSDictionary *launchoptions : MKLaunchOptionsDirectionsModeDriving; MKMapItem *currentlocationmapitem = [MKMapItem mapitemforcurrentlocation]; [MKMapItem openmapswithitems:@[currentlocationmapitem, mapitem] launchoptions:launchoptions]; ορίζουµε τις απαιτούµενες παραµέτρους και ανοίγουµε την εφαρµογή χαρτών περνώντας όλη την χρήσιµη πληροφορία που περιγράφηκε παραπάνω για την δηµιουργία της διαδροµής. - (void)alertview:(uialertview *)alertview clickedbuttonatindex: (NSInteger)buttonIndex if (buttonindex==0) 48
57 else if (buttonindex==1) CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake( , ); MKPlacemark *placemark = [[MKPlacemark alloc] initwithcoordinate:coordinate addressdictionary:nil]; MKMapItem *mapitem = [[MKMapItem alloc] initwithplacemark:placemark]; [mapitem setname:@"m.e.t"]; NSDictionary *launchoptions : MKLaunchOptionsDirectionsModeDriving; MKMapItem *currentlocationmapitem = [MKMapItem mapitemforcurrentlocation]; [MKMapItem openmapswithitems:@[currentlocationmapitem, mapitem] launchoptions:launchoptions]; Η µέθοδος -(IBAction)SegmentToggle:(UISegmentedControl*)sender; αναλόγως µε το τµήµα του SegmentedControl που έχει επιλεγεί, αλλάζει τον τύπο προβολής του χάρτη ανάµεσα σε: Standard Satellite Hybrid -(IBAction)SegmentToggle:(UISegmentedControl*)sender if (sender.selectedsegmentindex==0) _mapview.maptype = MKMapTypeStandard; else if (sender.selectedsegmentindex==1) _mapview.maptype = MKMapTypeSatellite; 49
58 else if (sender.selectedsegmentindex==2) _mapview.maptype = MKMapTypeHybrid; 50
59 CalendarView Ηµερολόγιο Εκδηλώσεων Το view αυτό περιέχει µια λίστα µε τις επερχόµενες εκδηλώσεις και δραστηριότητες που πρόκειται να φιλοξενήσει το Μουσείο Επιστηµών και Τεχνολογίας. Η αποθήκευση των γεγονότων γίνεται σε ένα Google Calendar απ το οποίο έπειτα κατεβαίνουν στην εφαρµογή κάθε φορά που ο χρήστης επιλέγει το Ηµερολόγιο Εκδηλώσεων από το κεντρικό µενού της εφαρµογής. Η υλοποίηση της λίστας γίνεται και πάλι µε τις µεθόδους: - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableview -(NSString *)tableview:(uitableview *)tableview titleforheaderinsection:(nsinteger)section -(NSInteger)tableView:(UITableView *)tableview numberofrowsinsection:(nsinteger)section -(UITableViewCell *)tableview:(uitableview *)tableview1 cellforrowatindexpath:(nsindexpath *)indexpath όπου η πρώτη µέθοδος επιστρέφει τον αριθµό των sections που στην συγκεκριµένη περίπτωση είναι 2 (Εκδηλώσεις και Δραστηριότητες). Ουσιαστικά επιστρέφει τον αριθµό των κατηγοριών ηµερολογίων που έχουν δηµιουργηθεί µέσα στο Google Calendar. Η δεύτερη επιστρέφει τον τίτλο των κατηγοριών. Η τρίτη επιστρέφει τον αριθµό των γεγονότων που βρίσκονται κάτω από κάθε κατηγορία. Η τέταρτη επιστρέφει το προσαρµοσµένο κελί. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableview return MAX( [data count], 1 ); - (NSString *)tableview:(uitableview *)tableview titleforheaderinsection:(nsinteger)section if( section<[data count] ) 51
60 NSMutableDictionary *dictionary = [data objectatindex:section]; GDataEntryCalendar *calendar = [dictionary objectforkey:key_calendar]; NSMutableArray *events = [dictionary objectforkey:key_events]; int count = [events count]; return [NSString stringwithformat:@"%@ (%i)", [[calendar title] stringvalue], count]; περιµένετε..."; - (NSInteger)tableView:(UITableView *)tableview numberofrowsinsection:(nsinteger)section if( section>=[data count] ) return 0; NSMutableDictionary *dictionary = [data objectatindex:section]; NSMutableArray *events = [dictionary objectforkey:key_events]; int count = [events count]; if( self.editing && [dictionary objectforkey:key_editable] ) count++; return count; Για να µπορέσει να γίνει εφικτή η επικοινωνία της εφαρµογής µε το Google Calendar χρησιµοποιήθηκε το open source project iphone-gcal το οποίο ξεκίνησε ο κ. Dan Bourque. Το συγκεκριµένο project αναπτύχθηκε αρχικά µε για λύσει το πρόβληµα του περιορισµού που είχε θέσει η Apple στην πρόσβαση των 3rd party εφαρµογών στα ηµερολόγια του iphone. Χρησιµοποιώντας τα Google APIs λοιπόν δηµιουργήθηκε µία βιβλιοθήκη ικανή να δηµιουργεί, κατεβάζει, ανανέωνει, διαγράφει κτλ γεγονότα από ένα Google Calendar. Πιο αναλυτικά, ξεκινώντας ο ελεγκτής εµφανίζει ένα στιγµιότυπο της κλάσης MBProgressHUD που αναλύσαµε προς τα πάνω µε στόχο την ενηµέρωση του χρήστη ότι πρέπει να περιµένει όσο γίνεται προσπάθεια πραγµατοποίησης της επικοινωνίας και ενηµέρωσης των γεγονότων. Παράλληλα γίνεται δέσµευση και αρχικοποίηση του instance googlecalendarservice της κλάσης GDataServiceGoogleCalendar ενώ το ίδιο 52
61 συµβαίνει και για τον πίνακα µεταβλητού µεγέθους (NSMutableArray) ονόµατι data. Έπειτα θέτονται τα στοιχεία σύνδεσης (username και password) στο googlecalendarservice και καλείται η µέθοδος refresh µε σκοπό να ξεκινήσει η διαδικασία για το κατέβασµα των δεδοµένων. - (void)viewdidload [super viewdidload]; tableview.separatorstyle = UITableViewCellStyleValue1; tableview.backgroundcolor = [UIColor clearcolor]; MBProgressHUD *hud = [MBProgressHUD showhudaddedto:self.view animated:yes]; hud.labeltext hud.detailslabeltext περιµένετε"; googlecalendarservice = [[GDataServiceGoogleCalendar alloc] init]; [googlecalendarservice setuseragent:@"danbourque- GTUGDemo-1.0"]; [googlecalendarservice setserviceshouldfollownextlinks:no]; data = [[NSMutableArray alloc] init]; [self loadsettings]; [googlecalendarservice setusercredentialswithusername:@ ************ password:@ ************ ]; // Start the fetch process. [self refresh]; CalendarView *calendarviewcontroller = [[CalendarView alloc] init]; UINavigationController *calendarnavigationcontroller = [[UINavigationController alloc] initwithrootviewcontroller:calendarviewcontroller]; calendarnavigationcontroller.title 53
62 Η µέθοδος refresh αφού καθαρίσει τον πίκανα data ώστε να µην υπάρχουν συµπλοκές δεδοµένων, καλεί την δική της µέθοδο: - (GDataServiceTicket *)fetchcalendarfeedforusername: (NSString *)username delegate:(id)delegate didfinishselector:(sel)finishedselector; η οποία µε την σειρά της και αφού επικοινωνήσει µε τον server καλεί µέσω του επιλογέα την µέθοδο: - (void)calendarsticket:(gdataserviceticket *)ticket finishedwithfeed:(gdatafeedcalendar *)feed error:(nserror *)error; Εάν έχει προκύψει κάποιο σφάλµα κατά το κατέβασµα, καλείται η µέθοδος: -(void)handleerror:(nserror *)error; η οποία διαβάζει το error code και εµφανίζει κατάλληλο µήνυµα στον χρήστη. Διαφορετικά εφόσον δεν έχει προκύψει σφάλµα ξεκινά η δηµιουργία της τοπικής λίστας προβολής γεγονότων. Αυτό γίνεται µε την δηµιουργεί ενός αντικειµένου ονόµατι calendar που ανήκει στην κλάση GDataEntryCalendar και ενός µεταβλητού µεγέθους λεξικό ονόµατι dictionary (NSMutableDictionary). Το κάθε calendar ανατίθεται στο dictionary έτσι ώστε να µπορούν να παρθούν οι τιµές που µας ενδιαφέρουν βάσει της λειτουργίας του λεξικού. Ένα αντικείµενο τύπου NSDictionary/NSMutableDictionary χρησιµεύει στην αποθήκευση/ανάκληση δεδοµένων µε χρήση λέξεων κλειδιών όπως και σε ένα πραγµατικό λεξικό. Αφού λοιπόν γίνουν όλες οι κατάλληλες αναθέσεις, αρχίζει η δηµιουργία των κελιών µε την πληροφορία που έχουµε λάβει. Για την δηµιουργία των κελιών δηµιουργηθηκε µία νέα υποκλάση της UITableViewCell η οποία περιέχει µία εικόνα µε την ηµεροµηνία του γεγονότος (ηµέρα και µήνας) και τον τίτλο του γεγονότος. - (void)handleerror:(nserror *)error NSString *title, *msg; if( [error code]==kgdatabadauthentication ) title Failed"; 54
63 msg username/password\n\nplease go to the iphone's settings to change your Google account credentials."; else title Error"; msg = [error localizeddescription]; UIAlertView *alert = [[UIAlertView alloc] initwithtitle:title message:msg delegate:nil cancelbuttontitle:@"ok" otherbuttontitles:nil]; [alert show]; [alert release]; Πατώντας πάνω σε ένα κελί και εφόσον έχουµε ορίσει την µετάβαση µέσω του Inteface Builder στο Storyboard, καλείται η µέθοδος: -(void)prepareforsegue:(uistoryboardsegue *)segue sender: (id)sender; η οποία προετοιµάζει την απαραίτητη πληροφορία που θα παρουσιαστεί στην επόµενη οθόνη η οποία εµφανίζει λεπτοµέριες για το γεγονός που έχει επιλεγεί EventPreview Το view αυτό περιέχει πεδία αποτελούµενα από εικόνα και κείµενο τα οποία περιέχουν ότι χρειάζεται να ξέρει ο χρήστης για το γεγονός το οποίο έχει επιλέξει. Πιο συγκεκριµένα περιέχει τα πεδία: Όνοµα Γεγονότος Πλήρης µορφή ηµεροµηνίας διεξαγωγής γεγονότος Ώρα Περιγραφή γεγονότος Κουµπί προσθήκης γεγονότος στο ηµερολόγιο του χρήστη Κατά την εκκίνησή του o controller αναθέτει όλες τις παραπάνω τιµές στα αντίστοιχα πεδία. Πατώντας Προσθήκη στο ηµερολόγιο µου καλείται η µέθοδος: 55
64 -(IBAction)addToMyCalendar:(id)sender η οποία εµφανίζει έναν Modal View Controller µε όλη την πληροφορία που πρόκειται να προστεθεί. Ο Modal View Controller είναι ο ελεγκτής που εµφανίζεται κατά την διάρκεια δηµιουργίας συνήθως κάποιου γεγονότος ή επαφής και αποτελεί έναν διαµεσολαβητή παρουσιάζοντας στον χρήστη την πληροφορία που πρόκειται να αποθηκευετεί δίνοντας του παράλληλα την δυνατότητα της επεξεργασίας. - (IBAction)addToMyCalendar:(id)sender EKEventStore *eventstore = [[EKEventStore alloc] init]; if ([eventstore respondstoselector:@selector(requestaccesstoentitytype:compl etion:)]) // the selector is available, so we must be on ios 6 or newer [eventstore requestaccesstoentitytype:ekentitytypeevent completion:^(bool granted, NSError *error) dispatch_async(dispatch_get_main_queue(), ^ if (error) // display error message here NSLog(@"ERROR"); else if (granted) // display access denied error message here NSLog(@"ACCESS DENIED"); else // access granted NSLog(@"ACCESS GRANTED OK"); // ***** do the important stuff here ***** NSString *hourfromtime = [time substringtoindex:2]; NSString *minutefromtime = [time substringfromindex:3]; NSString *hourfromendtime = [endtime substringtoindex:2]; NSString *minutefromendtime = [endtime substringfromindex:3]; 56
65 NSDate *startdate = [self datewithyear:[year intvalue] month:[month integervalue] day:[date integervalue] hour: [hourfromtime integervalue]+2 minute:[minutefromtime integervalue]]; NSDate *enddate1 = [self datewithyear:[endyear intvalue] month:[endmonth integervalue] day:[enddate integervalue] hour:[hourfromendtime integervalue] minute: [minutefromendtime integervalue]]; [self createevent:name at:addr starting:tempstart ending:tempend withbody:comments andurl:nil]; ); ]; else // this code runs in ios 4 or ios 5 // ***** do the important stuff here ***** Καλώντας λοιπόν την παραπάνω µέθοδο δηµιουργείται το αντικείµενο eventstore τύπου EKEventStore το οποίο αντιπροσωπεύει την βάση δεδοµένων του ηµερολογίου του τηλεφώνου. Αποτελεί ένα σηµείο διαµεσολάβησης της εφαρµογής µε τα δεδοµένα του ηµερολογίου και των υποµνήσεων. Στην συνέχεια γίνεται έλεγχος αν το σύστηµα υποστηρίζει την µέθοδο requestaccesstoentitytype:completion: καθώς υποστήριζεται µόνο σε ios 6 & 7. Αν και στην συγκεκριµένη περίπτωση τέτοιου είδους έλεγχος είναι περιττός καθώς η εφαρµογή αναπτύσσεται για ios7, δεν είναι κακό να υπάρχει για ενδεχόµενη µελλοντική επέκταση και σε προηγούµενες εκδόσεις του λειτουργικού (δηλαδή ios<6.0). Έπειτα ζητείται από τον χρήστη έγκριση για πρόσβαση στο ηµερολόγιο του. Αν ο χρήστης πατήσει όχι ή εµφανιστεί κάποιο σφάλµα, η διαδικασία ακυρώνεται (περιπτώσεις error και granted). Αν συµφωνήσει δηµιουργούνται τοπικές µεταβλητές αντικειµένων που κρατούν τα στοιχεία που θα χρειαστούν για την εµφάνιση του modal view στον χρήστη και κατ επέκταση την αποθήκευση αυτού στο ηµερολόγιο του χρήστη. Οι µεταβλητές αυτές περιλαµβάνουν: όνοµα γεγονότος 57
66 τοποθεσία ώρα έναρξης ώρα τέλους περιγραφή Με είσοδο αυτά τα δεδοµένα καλείται η µέθοδος: - (BOOL)createEvent:(NSString *)title at:(nsstring *)location starting:(nsdate *)startdate ending:(nsdate *)enddate withbody:(nsstring *)body andurl:(nsurl *)url η οποία αφού δηµιουργείται αντικείµενο τύπου event τύπου EKEvent της ανατίθενται τα δεδοµένα που εισήχθησαν. Ένα στιγµιότυπο της κλάσης ΕΚEvent αναπαριστά ένα γεγονός το οποίο αποθηκεύεται στο ηµερολόγιο του χρήστη. Στη συνέχεια ορίζεται η µεταβλητή interval η οποία αναφέρεται στην χρονική στιγµή που η εφαρµογή ηµερολογίου θα ειδοποιήσει τον χρήστη για το αποθηκευµένο γεγονός. Στην περίπτωση µας, της δίνεται η τιµή -60*60*2 το οποίο σηµαίνει 2 ώρες πριν την έναρξη του γεγονότος (µετριέται σε seconds). - (BOOL)createEvent:(NSString *)title at:(nsstring *)location starting:(nsdate *)startdate ending:(nsdate *)enddate withbody:(nsstring *)body andurl:(nsurl *)url EKEventStore *eventstore = [[EKEventStore alloc] init]; EKEvent *event = [EKEvent eventwitheventstore:eventstore]; event.title = title; event.location Επιστηµών & Τεχνολογίας"; event.startdate = startdate; event.enddate = enddate; event.notes = body; if (url) event.url = url; NSTimeInterval interval = -60*60*2; 58
67 EKAlarm *alarm = [EKAlarm alarmwithrelativeoffset:interval]; NSArray *alarms = [[NSArray alloc] initwithobjects:alarm, nil]; //[myevent addalarm:alarm]; event.alarms = alarms; [event setcalendar:[eventstore defaultcalendarfornewevents]]; EKEventEditViewController *eventviewcontroller = [[EKEventEditViewController alloc] init]; eventviewcontroller.event = event; eventviewcontroller.eventstore = eventstore; eventviewcontroller.editviewdelegate = self; [self presentviewcontroller:eventviewcontroller animated:yes completion:nil]; return TRUE; Αφού λοιπόν οριστεί το αντικείµενο alarm, προστίθεται επίσης στο event που ορίσαµε πιο πάνω και δηµιουργείται αντικείµενο τύπου EKEventEditViewController το οποίο επιτρέπει στον χρήστη να δει και να επεξεργαστεί το συµβάν πρωτού το αποθηκεύσει ή το απορρίψει. Η παρουσίαση αυτού γίνεται µε την κώδικα: [self presentviewcontroller:eventviewcontroller animated:yes completion:nil]; Για να έχουµε µια εικόνα του τι έκανε τελικά ο χρήστης και να µπορούµε να τον ενηµερώσουµε σχετικά µε επιτυχία/αποτύχια/ακύρωση, υλοποιούµε την delegate µέθοδο: -(void)eventeditviewcontroller:(ekeventeditviewcontroller *)controller didcompletewithaction: (EKEventEditViewAction)action; η οποία αναλόγως µε την τιµή της µεταβλητής action αντιστοιχεί στις εξής περιπτώσεις: EKEventEditViewActionSaved, που σηµαίνει ότι το συµβάν αποθηκεύτηκε επιτυχώς στο ηµερολόγιο του χρήστη 59
68 EKEventEditViewActionCanceled, που σηµαίνει ότι ακυρώθηκε η αποθήκευση Άγνωστο, όπου προέκυψε κάποιο σφάλµα Αφού λοιπόν εξακριβωθεί η κατάσταση, εµφανίζονται αντίστοιχα µηνύµατα. -(void)eventeditviewcontroller:(ekeventeditviewcontroller *)controller didcompletewithaction: (EKEventEditViewAction)action [self dismissviewcontrolleranimated:yes completion:nil]; if(action==ekeventeditviewactionsaved) UIAlertView *alert = [[UIAlertView alloc] initwithtitle:@"επιτυχία" message:@"το συµβάν προστέθηκε µε επιτυχία στο ηµερολόγιο σας" delegate:self cancelbuttontitle:@"ok" otherbuttontitles:nil, nil]; [alert show]; else if (action==ekeventeditviewactioncanceled) else UIAlertView *alert = [[UIAlertView alloc] initwithtitle:@"σφάλµα" message:@"άγνωστο σφάλµα" delegate:self cancelbuttontitle:@"ok" otherbuttontitles:nil, nil]; [alert show]; Επίσης µια ακόµα µέθοδος που πρέπει να αναφέρουµε είναι η: -(NSDate *)datewithyear:(nsinteger)year1 month: (NSInteger)month1 day:(nsinteger)day hour:(nsinteger)hour minute:(nsinteger)minute; η οποία αναλαµβάνει την καλύτερη διαχείριση της ηµεροµηνίας, της ώρας και της ζώνης ώρας. Συγκεκριµένα, λαµβάνει ως είσοδο τις µεταβλητές που αντιστοιχούν στην ώρα και στην ηµεροµηνία και έπειτα δηµιουργείται αντίκειµενο τύπου NSDateComponents στο οποίο πραγµατοποιεί τις απαιτούµενες αλλαγές. Η κλάση NSDateComponents κρατάει τα κοµµάτια της ηµεροµηνίας παρουσιάζοντας τα σε µία πιο αντικειµενοστραφή προσέγγιση. 60
69 - (NSDate *)datewithyear:(nsinteger)year1 month: (NSInteger)month1 day:(nsinteger)day hour:(nsinteger)hour minute:(nsinteger)minute NSCalendar *calendar = [[NSCalendar alloc] initwithcalendaridentifier:nsgregoriancalendar]; NSDateComponents *components = [[NSDateComponents alloc] init]; [components setyear:year1+1]; [components setmonth:month1]; [components setday:day]; [components sethour:hour]; [components setminute:minute]; [components settimezone:[nstimezone timezonewithabbreviation:@"eet"]]; return [calendar datefromcomponents:components]; 61
70 Επικοινωνία Contact To view αυτό περιέχει τέσσερα αντικείµενα τύπου UIButton που το καθένα αντιστοιχεί σε έναν τρόπο επικοινωνίας/διασύνδεσης µε το Μουσείο Επιστηµών και Τεχνολογίας. Αυτά είναι: Τηλέφωνο Facebook Website Επιλέγοντας το πρώτο κουµπί εµφανίζεται λίστα µε τα τηλέφωνα επικοινωνίας του Μουσείου. Αυτό υλοποιείται µέσω ενός UIActionSheet. H κλάση αυτή παρουσιάζει στον χρήστη ένα σετ επιλογών και προτρέπει τον χρήστη να επιλέξει µία. Για να υλοποιηθεί το actionsheet χρειαζόµαστε 2 µεθόδους. Την µέθοδο η οποία θα αναλάβει να δηµιουργήσει το actionsheet και να το δείξει στον χρήστη και την delegate µέθοδο η οποία θα αναλάβει να εκτελέσει κώδικα βάσει της επιλογής του χρήστη: -(void)showactionsheet:(id)sender; - (void)actionsheet:(uiactionsheet *)actionsheet clickedbuttonatindex:(nsinteger)buttonindex; Στη συγκεκριµένη περίπτωση ο κώδικας που θα πρέπει να εκτελεστεί αφορά την δηµιουργία τηλεφωνικής κλήσης. Αυτό πραγµατοποιείται µέσω των εντολών: NSURL* contacttelurl = [NSURL URLWithString:[NSString stringwithformat:@"tel:%@", buttontitle]]; [[UIApplication sharedapplication] openurl:contacttelurl]; Δηµιουργούµε ένα αντικείµενο τύπου NSURL το οποίο χρησιµοποιείται για την δηµιουργία και διαχείρηση urls. Βάζοντας το πρόθεµα tel:,εν συνεχεία το επιλεγµένο τηλέφωνο και έπειτα εκτελώντας την εντολή openurl: πραγµατοποιούµε κλήση µεταβαίνοντας στην προεγκατεστηµένη εφαρµογή τηλεφώνου της συσκευής. Πρώτα όµως γίνεται έλεγχος αν η συσκευή µπορεί να πραγµατοποιήσει κλήσεις µέσω του κώδικα: 62
71 if ([[UIApplication sharedapplication] canopenurl:[nsurl tel://"]]) - (void)showactionsheet:(id)sender //Define method to show action sheet NSString *actionsheettitle Μ.Ε.Τ"; //Action Sheet Title NSString *destructivetitle "; //Action Sheet Button Titles NSString *tel "; NSString *tel "; NSString *tel "; NSString *canceltitle UIActionSheet *actionsheet = [[UIActionSheet alloc] initwithtitle:actionsheettitle delegate:self cancelbuttontitle:canceltitle destructivebuttontitle:destructivetitle otherbuttontitles:tel1, tel2, tel3, nil]; [actionsheet showinview:self.view]; - (void)actionsheet:(uiactionsheet *)actionsheet clickedbuttonatindex:(nsinteger)buttonindex //Get the name of the current pressed button NSString *buttontitle = [actionsheet buttontitleatindex:buttonindex]; if ([[UIApplication sharedapplication] canopenurl:[nsurl URLWithString:@"tel://"]]) if ([buttontitle isequaltostring:@"fax: "]) NSLog(@"Fax"); 63
72 else if ([buttontitle else NSURL* contacttelurl = [NSURL URLWithString:[NSString stringwithformat:@"tel:%@", buttontitle]]; [[UIApplication sharedapplication] openurl:contacttelurl]; else NSLog(@"DOES NOT SUPPORT CALLS"); Επιλέγοντας το δεύτερο κουµπί καλεί την µέθοδο: -(IBAction)sendMail:(id)sender; η οποία δηµιουργεί ένα αντικείµενο τύπου MFMailComposeViewController το οποίο είναι µία κλάση που παρέχει διεπαφή για επεξεργασία και αποστολή µηνυµάτων ηλεκτρονικού ταχυδροµείου. Μετά την ανάθεση τιµών στα πεδία της διεπαφής παρουσιάζεται ως modal view µέσω της εντολής: [self presentviewcontroller:mc animated:yes completion:null]; - (IBAction)sendMail:(id)sender NSString * title // Content NSString *messagebody // To address NSString *torecipient NSArray *torecipients = [NSArray arraywithobject:torecipient]; MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init]; 64
73 mc.mailcomposedelegate = self; [mc setsubject: title]; [mc setmessagebody:messagebody ishtml:no]; [mc settorecipients:torecipients]; // Present mail view controller on screen [self presentviewcontroller:mc animated:yes completion:null]; Και σ αυτή στην περίπτωση υλοποιείται delegate µέθοδος η οποία θα ενηµερώσει για την κατάσταση της επικοινωνίας µέσω -(void)mailcomposecontroller:(mfmailcomposeviewcontroller *)controller didfinishwithresult:(mfmailcomposeresult)result error:(nserror *)error; Συγκεκριµένα, διαβάζει το result και αντιδρά αναλόγως. Οι καταστάσεις αυτές είναι: MFMailComposeResultCancelled MFMailComposeResultSaved MFMailComposeResultSent MFMailComposeResultFailed και αντιστοιχούν στις αποτελέσµατα που αναφέρουν στα ονόµατά τους. - (void)mailcomposecontroller:(mfmailcomposeviewcontroller *)controller didfinishwithresult:(mfmailcomposeresult)result error:(nserror *)error switch (result) case MFMailComposeResultCancelled: NSLog(@"Mail cancelled"); break; case MFMailComposeResultSaved: NSLog(@"Mail saved"); break; case MFMailComposeResultSent: NSLog(@"Mail sent"); break; case MFMailComposeResultFailed: 65
74 sent failure: [error localizeddescription]); break; default: break; // Close the Mail Interface [self dismissviewcontrolleranimated:yes completion:null]; Τέλος, το τρίτο και τέταρτο κουµπί καλούν τις µεθόδους -(IBAction)showFacebook:(id)sender; -(IBAction)showWebsite:(id)sender; οι οποίες ανοίγουν τις σελίδες του Μουσείου στο κοινωνικό δίκτυο Facebook και του επίσηµου site του Μουσείου αντίστοιχα. 66
75 - (IBAction)showFacebook:(id)sender NSURL* contacttelurl = [NSURL URLWithString:[NSString stringwithformat:@" "]]; [[UIApplication sharedapplication] openurl:contacttelurl]; - (IBAction)showWebsite:(id)sender NSURL* contacttelurl = [NSURL URLWithString:[NSString stringwithformat:@" [[UIApplication sharedapplication] openurl:contacttelurl]; 67
76 ΚΕΦΑΛΑΙΟ 4 ΠΑΡΑΔΕΙΓΜΑΤΑ ΧΡΗΣΗΣ Σ αυτό το κεφάλαιο παρουσιάζεται ένας συνοπτικός οδηγός αποτελούµενος από παραδείγµατα χρήσης µε σκοπό κάποιος να µπορεί να χρησιµοποιήσει την εφαρµογή χωρίς να χρειάζεται να έχει διαβάσει τις τεχνικές λεπτοµέρειες. Αρχικό Μενού. Κατά την εκκίνηση της εφαρµογής και µετά την εµφάνιση της εικόνας εκκίνησης (LaunchImage) εµφανίζεται το κύριο µενού όπου δίνονται οι εξής επιλογές πλοήγησης: Το Μουσείο Τι µπορώ να δω στο ΜΕΤ; Πως µπορώ να έρθω στομετ; Ηµερολόγιο Εκδηλώσεων Επικοινωνία 68
77 Το Μουσείο Πατώντας στην πρώτη επιλογή µπορούµε να δούµε τα κύρια θέµατα που σχετίζονται µε το Μουσείο Επιστηµών και Τεχνολογίας τα οποία είναι: Στόχοι Δραστηριότητες Ιστορία Εκπαιδευτικές Δράσεις Ενηµερωτικές & Ψυχαγωγικές Εκδηλώσεις Εθελοντισµός Ηµέρες & Ώρες Λειτουργίας Επιλέγοντας ένα από τα παραπάνω µπορούµε να δούµε λεπτοµέρειες. Για παράδειγµα, επιλέγοντας Στόχοι βλέπουµε περισσότερα για τους στόχους του Μουσείου Επιστηµών και Τεχνολογίας. Στο κάτω µέρος της οθόνης υπάρχουν τα κουµπιά α και Α τα οποία µικραίνουν και αυξάνουν την γραµµατοσειρά του κειµένου αντίστοιχα. 69
78 Τι µπορώ να δω στο ΜΕΤ; Πατώντας στην δεύτερη επιλογή µπορούµε να δούµε λίστα µε τους χώρους που διατίθενται για 3D Περιήγηση. Πατώντας στο κουµπί Βοήθεια µπορούµε να δούµε περισσότερα για την χρήση της 3D περιήγησης στην επόµενη οθόνη. 70
79 Επιλέγοντας έναν χώρο από την λίστα µεταφερόµαστε στο περιβάλλον περιβάλλον 3D περιήγησης. Μπορούµε να δούµε τον χώρο γύρω µας, σύροντας το δάκτυλο µας προς οποιαδήποτε κατεύθυνση. Πατώντας πάνω στα σηµεία ενδιαφέροντος (POIs - Points Of Interests) ο χρήστης µπορεί να δει περισσότερες πληροφορίες για επιλεγµένα εκθέµατα. Στο συγκεκριµένο παράδειγµα έχει επιλεχθεί το POI που ήταν πάνω στην Πυρσεία. Αντίστοιχα µε προηγουµένως τα κουµπιά α και A αντιπροσωπεύουν την σµίκρυνση και την µεγένθυνση της γραµµατοσειράς. 71
80 Πως µπορώ να έρθω στο ΜΕΤ; Πατώντας στην τρίτη επιλογή, εµφανίζεται χάρτης µε την ακριβή θέση του Μουσείου Επιστηµών και Τεχνολογίας στην περιοχή του Πανεπιστηµίου Πατρών. Ο χρήστης µπορεί να µετακινηθεί ελεύθερα στον χάρτη όπως και να µικρύνει / µεγενθύνει την εµφανιζόµενη περιοχή χρησιµοποιώντας multitouch gestures (pinch out για σµίκρυνση, pinch in για µεγέθυνση). Επίσης δίνεται στον χρήστη η δυνατότητα να επιλέξει τύπο προβολής χάρτη ανάµεσα σε Κανονική, Δορυφόρο και Υβριδική. 72 Ακόµα, πατώντας στο κουµπί Πλοήγηση στο Μ.Ε.Τ, η εφαρµογή αφού ρωτήσει τον χρήστη µε σχετικό µήνυµα, δίνει εντολή να ανοίξει η προεγκατεστηµένη εφαρµογή χαρτών Maps της συσκευής όπου δηµιουργεί διαδροµή από το σηµείο που βρισκόµαστε, στο σηµείου που βρίσκεται το Μ.Ε.Τ.
81 Ηµερολόγιο Εκδηλώσεων Πάτωντας στην τέταρτη επιλογή εµφανίζεται λίστα µε τις επερχόµενες εκδηλώσεις και δραστηριότητες που πρόκειται να λάβουν µέρος στο Μουσείο Επιστηµών και Τεχνολογίας. Πατώντας πάνω σε µια εκδήλωση µπορούµε να δούµε περισσότερες πληροφορίες για αυτήν όπως ώρα και περιγραφή. 73
82 Πατώντας στο κουµπί Προσθήκη στο ηµερολόγιο µου εµφανίζεται οθόνη µε όλες τις λεπτοµέρειες του γεγονότος συµπληρωµένες. Πατώντας Done, το γεγονός προστίθεται στο ηµερολόγιο του χρήστη έτσι ώστε να ενηµερωθεί εγκαίρως για το γεγονός στο οποίο θέλει να παρευρεθεί. 74
83 Επικοινωνία Πατώντας στην τελευταία επιλογή δίνονται διάφορες επιλογές τρόπων επικοινωνίας µε το Μουσείο Επιστηµών και Τεχνολογίας. Πιο συγκεκριµένα, η επικοινωνία µπορεί να πραγµατοποιηθεί µέσω: Τηλεφωνικής κλήσης Facebook Website του Μ.Ε.Τ Στην πρώτη περίπτωση αναδύεται παράθυρο µε τα τηλέφωνα του Μ.Ε.Τ και αν η συσκευή µπορεί να πραγµατοποιήσει κλήσεις ο χρήστης έχει την δυνατότητα να καλέσει απευθείας. Στην δεύτερη περίπτωση αναδύεται φόρµα σύνταξης χρησιµοποιώντας τον προεπιλέγµενο λογαριασµό του χρήστη. Στην τρίτη και τέταρτη περίπτωση, ο χρήστης µεταφέρεται στον προεπιλεγµένο φυλλοµετρητή του τηλεφώνου όπου µπορεί να δει τις αντίστοιχες σελίδες και να αλληλεπιδράσει µαζί τους. 75
84 ΚΕΦΑΛΑΙΟ 5 ΜΕΤΡΗΣΕΙΣ Οι φορητές συσκευές διαθέτουν περιορισµένους πόρους όσον αφορά την διαθέσιµη µνήµη, επάρκεια µπαταρίας, επεξεργαστική ισχύ κτλ. Έτσι δηµιουργώντας µια εφαρµογή πρέπει πάντα να έχουµε κατά νου αυτούς τους περιορισµούς. Στην ενότητα αυτή αναφέρονται κάποια πειράµατα και µετρήσεις που έχουν γίνει στο τελικό αποτέλεσµα µε εργαλεία που παρέχονται από την προγραµµατιστική σουίτα του Xcode. Τα εργαλεία αυτά είναι o Analyzer και ο Profiler (µέρος του εργαλείου Instruments). O Analyzer είναι ένα εργαλείο το οποίο σκανάρει τον κώδικα χωρίς να τον εκτελέσει και δίνει µια εκτίµηση των σφαλµάτων που πιθανώς να προκύψουν όπως: διαρροές µνήµης λάθη λογικής (π.χ. διαίρεση µε το µηδέν) απρόσιτα κοµµάτια µνήµης λόγω αποδέσµευσης δείκτη από αυτά κενούς δείκτες αντικείµενα ή µεταβλητές που δεν χρησιµοποιούνται ποτέ κτλ. Ο Profiler είναι ένα άλλο εργαλείο το οποίο παρακολουθεί γραφικά αλλά και καταγράφει ταυτόχρονα την πορεία ορισµένων παραµέτρων (εκτελώντας όµως τον κώδικα) όπως: Τις δεσµεύσεις µνήµης Τις διαρροές µνήµης Της χρήσης cpu, του αποθηκευτικού χώρου και του δικτύου Των αντικειµένων zombie, τα οποία αποτελούν χώρο µνήµης που αποδεσµεύεται ξανά και ξανά ενώ έχει ήδη αποδεσµευτεί. Ακολουθούν κάποια screenshots από τα αποτελέσµατα που έδωσαν τα προγράµµατα αυτά: 76
85 Analyzer: Ο Analyzer λοιπόν αναφέρει ότι βρήκε 50 πιθανά σηµεία που ενδέχεται να προκαλέσουν κάποιο σφάλµα. Την πλειοψήφια αποτελούν σφάλµατα λογικής όπως null pointers ή αχρείαστες µεταβλητές. Profiler: Αυτό συµβαίνει γιατί ορισµένα frameworks που χρησιµοποιούνται στην παρούσα εργασία είχαν σχεδίαστει για πολύ κατώτερες εκδόσεις του λειτουργικού συστήµατος ios και δεν αναβαθµίστηκαν ποτέ αφού οι developers τα άφησαν. Παρόλαυτα τα πιθανά σφάλµατα που εκτίµησε ο Analyzer δεν επηρέαζουν σε κανένα σηµείο την λειτουργία της εφαρµογής καθώς αναφέρονται σε διαδικασίες ή µεθόδους που δεν χρησιµοποιούνται. Ο Profiler έδειξε ότι κατά την πρώτη είσοδο στην 3D περιήγηση υπάρχει ένα στιγµιαίο σχετικά υψηλό memory leak το οποίο όµως παρουσιάζεται µόνο την πρώτη φορά. Τις επόµενες διατηρείται σε πολύ χαµηλά επίπεδα σε σηµείο που το καθιστά µη ικανό να οδηγήσει σε πρόβληµα. Αυτό συµβαίνει και πάλι λόγω της µη συνεχής συντήρησης και αναβάθµισης των σχετικών open source frameworks που χρησιµοποιήθηκαν. 77
86 Συµπερασµατικά λοιπόν καταλήγουµε στα εξής: Όσον αφορά τα πιθανά λάθη που εκτίµησε ο Analyzer δεν παρατηρήθηκε κάποιο πρόβληµα. Όσον αφορά τον Profiler, παρόλο που έγινε κάθε δυνατή προσπάθεια εξάλειψης κάθε διαρροής µνήµης, δυστυχώς αυτό δεν κατέστει ολοκληρωτικά εφικτό αλλά σίγουρα πραγµατοποιήθηκε σε έναν ικανοποιητικό βαθµό µε κάποιες παρεµβάσεις στον open source κώδικα. 78
ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΗΣ ΣΕ ΠΕΡΙΒΑΛΛΟΝ iphone ΓΙΑ ΤΗΝ ΔΙΕΥΚΟΛΥΝΣΗ ΤΗΣ ΠΡΟΣΒΑΣΗΣ ΤΩΝ ΦΟΙΤΗΤΩΝ ΣΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ
ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΗΣ ΣΕ ΠΕΡΙΒΑΛΛΟΝ iphone ΓΙΑ ΤΗΝ ΔΙΕΥΚΟΛΥΝΣΗ ΤΗΣ ΠΡΟΣΒΑΣΗΣ ΤΩΝ ΦΟΙΤΗΤΩΝ ΣΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΓΕΩΡΓΙΟΥ ΧΡΙΣΤΟΥΛΑΚΗ ΕΠΙΒΛΕΠΩΝ: Κ. ΣΓΑΡΜΠΑΣ ΠΑΤΡΑ - ΙΟΥΝΙΟΣ 2012 ΠΙΣΤΟΠΟΙΗΣΗ
SOCIAL LOCATION BASED APP
1 ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ ΕΦΑΡΜΟΓΗ ios APPLICATION ios SOCIAL LOCATION BASED APP ΣΟΥΜΠΛΗΣ ΑΝΤΩΝΙΟΣ ΙΩΑΝΝΗΣ ΤΖΑΝΑΚΗΣ ΑΡΝΑΟΥΤΑΚΗΣ ΛΕΑΝΔΡΟΣ Επιβλέπων : Ακρίτας
2.1 Αντικειµενοστρεφής προγραµµατισµός
2.1 Αντικειµενοστρεφής προγραµµατισµός Στον αντικειµενοστρεφή προγραµµατισµό (object oriented programming, OOP) ένα πρόγραµµα υπολογιστή είναι ένα σύνολο αλληλεπιδρώντων αντικειµένων. Μπορεί να ειπωθεί
Κλάσεις και Αντικείµενα
Κλάσεις και Αντικείµενα Γρηγόρης Τσουµάκας Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης Κλάσεις και Αντικείµενα 2 Τα αντικείµενα σε µια αντικειµενοστρεφή γλώσσα προγραµµατισµού, µοντελοποιούν
int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι
Εισαγωγή Στον Προγραµµατισµό «C» Πίνακες Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Νικόλαος Δ. Τσελίκας Νικόλαος Προγραµµατισµός Δ. Τσελίκας Ι Πίνακες στη C Ένας πίνακας στη C είναι
Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1
Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα Προγραμματισμός II 1 lalis@inf.uth.gr Χρήση λογισμικού που ήδη υπάρχει Τα πολύπλοκα συστήματα αναπτύσσονται σταδιακά, «χτίζοντας» πάνω σε υπάρχουσα λειτουργικότητα
Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010
Τμήμα Πληροφορικής & Επικοινωνιών Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010 Ιωάννης Γεωργουδάκης - Πάρις Μαστοροκώστας Σεπτέμβριος 2011 ΠΕΡΙΕΧΟΜΕΝΑ
Αντικειµενοστρεφής Προγραµµατισµός
16 η διάλεξη Π. Σταθοπούλου pstath@ece.upatras.gr ή pstath@upatras.gr Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Φροντιστήριο : ευτέρα 11πµ-12πµ ΗΛ4 Προηγούµενη ιάλεξη
Δομημένος Προγραμματισμός
ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα: Συναρτήσεις θεωρία Δ. Ε. Μετάφας Τμ. Ηλεκτρονικών Μηχ. Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό
Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο
Προγραμματισμός Ι Δυναμική Διαχείριση Μνήμης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2011-2012 Ανάγκη για Δυναμική Μνήμη Στατική Μνήμη Μέχρι τώρα χρησιμοποιούσαμε
Χειρισµός Σφαλµάτων. Γρηγόρης Τσουµάκας. Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης. Έκδοση:
Χειρισµός Σφαλµάτων Γρηγόρης Τσουµάκας Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης Έκδοση: 2010.12.06 Σφάλµατα, Σφάλµατα, Σφάλµατα 2 εν υπάρχουν προγράµµατα χωρίς λογικά λάθη Υλοποίηση που
Wrapper Classes, Abstract Classes and Interfaces
Wrapper Classes, Abstract Classes and Interfaces Εβδοµάδα 3: Κλάσεις συσκευαστές, αφηρηµένες κλάσεις και διαπροσωπείες Αντικείµενα και µη-αντικείµενα Η Java παρέχει τύπους αντικειµένων και απλούς τύπους
Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java
Εξάμηνο Μάθημα Τίτλος 2017 2018 Εαρινό Αντικειμενοστραφής Προγραμματισμός Ι Ύλη εργαστηρίου, Ασκήσεις Java Ημερομηνία Εργαστήριο 5 ο Α. Ύλη εργαστηρίου 5.1 Έννοιες αντικειμενοστραφούς προγραμματισμού,
Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr
Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Εργαστήριο 1 Εισαγωγή στη C Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Διαδικαστικά Ιστοσελίδα μαθήματος: http://eclass.uoa.gr/courses/f30/ Υποχρεωτική παρακολούθηση: Παρασκευή 14:00 16:00 στην
Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού ( Απαντήσεις & Λύσεις Βιβλίου) 1. Σκοποί κεφαλαίου Κύκλος ανάπτυξης προγράµµατος Κατηγορίες γλωσσών προγραµµατισµού
Αρχές Τεχνολογίας Λογισμικού Εργαστήριο
Αρχές Τεχνολογίας Λογισμικού Εργαστήριο Κωδικός Μαθήματος: TP323 Ώρες Εργαστηρίου: 2/εβδομάδα (Διαφάνειες Νίκου Βιδάκη) 1 JAVA Inheritance Εβδομάδα Νο. 3 2 Προηγούμενο μάθημα (1/2) Τι είναι αντικείμενο?
Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java
Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java Δρ. Απόστολος Γκάμας Λέκτορας (407/80) gkamas@uop.gr Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου Διαφάνεια 1 Εισαγωγή
Λογισµικό (Software SW) Γλώσσες
Λογισµικό (Software SW) Γλώσσες Προγραµµατισµού Οι γενιές των γλωσσών προγραµµατισµού Προβλήµατα που επιλύονται σε ένα περιβάλλον στο οποίο ο άνθρωπος πρέπει να προσαρµόζεται στα χαρακτηριστικά της µηχανής
Ο Οδηγός γρήγορης εκκίνησης
Ο Οδηγός γρήγορης εκκίνησης του Microsoft PowerPoint 2013 έχει διαφορετική εμφάνιση από προηγούμενες εκδόσεις. Γι αυτό το λόγο, δημιουργήσαμε αυτόν τον οδηγό για να ελαχιστοποιήσουμε την καμπύλη εκμάθησης.
ΜΕΛΕΤΗ ΤΟΥ ios SDK ΚΑΙ ΑΞΙΟΠΟΙΗΣΗ ΤΟΥ ΓΙΑ
ΜΕΛΕΤΗ ΤΟΥ ios SDK ΚΑΙ ΑΞΙΟΠΟΙΗΣΗ ΤΟΥ ΓΙΑ ΤΗΝ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΗΣ ΔΙΑΧΕΙΡΙΣΗΣ ΚΑΙ ΕΠΕΞΕΡΓΑΣΙΑΣ ΦΩΤΟΓΡΑΦΙΩΝ Διπλωματική Εργασία Ανδρέας Ζήμνας Επιβλέπων: Ιωάννης Μαυρίδης, Επίκουρος Καθηγητής Τμήμα Εφαρμοσμένης
Σε αυτό το µάθηµα θα ασχοληθούµε µε τη βελτίωση της εµφάνισης ενός ιστοτόπου, αλλά και τον εύκολο χειρισµό όλων των αλλαγών στην εµφάνιση της σελίδας
Σε αυτό το µάθηµα θα ασχοληθούµε µε τη βελτίωση της εµφάνισης ενός ιστοτόπου, αλλά και τον εύκολο χειρισµό όλων των αλλαγών στην εµφάνιση της σελίδας µέσω της τεχνολογίας των ιαδοχικών Φύλλων Στυλ (cascading
Επεξεργασία Αρχείων Κειµένου
Επεξεργασία Αρχείων Κειµένου Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Αρχεία Κειµένου Γενικά Συναρτήσεις Επεξεργασίας Αρχείων Κειµένου ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1 Αρχεία Γενικά
Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική
ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική Ενότητα 7: Συναρτήσεις Νικόλαος Στεργιούλας Τμήμα Φυσικής Άδειες Χρήσης Το παρόν εκπαιδευτικό
(Διαφάνειες Νίκου Βιδάκη)
(Διαφάνειες Νίκου Βιδάκη) JAVA Inheritance Εβδομάδα Νο. 3 2 Προηγούμενο μάθημα (1/2) Τι είναι αντικείμενο? Ανάλυση αντικειμένων Πραγματικά αντικείμενα Καταστάσεις Συμπεριφορές Αντικείμενα στον προγραμματισμό
ΗΜΙΟΥΡΓΙΑ ΠΑΙΧΝΙ ΙΟΥ ΣΤΟ SCRATCH ΒΗΜΑ ΠΡΟΣ ΒΗΜΑ
ΗΜΙΟΥΡΓΙΑ ΠΑΙΧΝΙ ΙΟΥ ΣΤΟ SCRATCH ΒΗΜΑ ΠΡΟΣ ΒΗΜΑ ΣΕΝΑΡΙΟ ΠΑΙΧΝΙ ΙΟΥ Το παιχνίδι θα αποτελείται από δυο παίκτες, οι οποίοι θα βρίσκονται αντικριστά στις άκρες ενός γηπέδου δεξιά και αριστερά, και µια µπάλα.
Εργαστήριο 1-1 η Άσκηση - Ανάλυση
Εργαστήριο 1-1 η Άσκηση - Ανάλυση Εκφώνηση: Δημιουργείστε εφαρμογή σε Java Swing με χρήση του IDE NetBeans όπου θα παρουσιάζεται ποιο κουμπί πατήθηκε. Η εφαρμογή θα μοιάζει ως εξής: Πρώτο Βήμα: Αρχική
Βασικά Στοιχεία της Java
Βασικά Στοιχεία της Java Παύλος Εφραιμίδης Java Βασικά Στοιχεία της γλώσσας Java 1 Τύποι Δεδομένων Η Java έχει δύο κατηγορίες τύπων δεδομένων: πρωτογενείς (primitive) τύπους δεδομένων αναφορές Java Βασικά
Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#
Εισαγωγή σε αντικειμενοστραφή concepts Και λίγη C# Κλάσεις Κλάση: τύπος δεδομένων που αποτελεί συλλογή πεδίων, ορισμών συναρτήσεων/μεθόδων και ορισμών άλλων τύπων δεδομένων. Αντίστοιχο σκεπτικό με struct
Διαφορές single-processor αρχιτεκτονικών και SoCs
13.1 Τα συστήματα και η επικοινωνία μεταξύ τους γίνονται όλο και περισσότερο πολύπλοκα. Δεν μπορούν να περιγραφούνε επαρκώς στο επίπεδο RTL καθώς αυτή η διαδικασία γίνεται πλέον αρκετά χρονοβόρα. Για αυτό
Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)
Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Χειµώνας 2005 ιάλεξη 5η Ιστοσελίδα του µαθήµατος http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm Θα τοποθετούνται
Εισαγωγή στην Πληροφορική
Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων Εισαγωγή στην Πληροφορική Ενότητα 8: Λειτουργικά Συστήματα Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά
ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C
ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C Στο εργαστήριο αυτό, θα ασχοληθούμε με δύο προγραμματιστικά περιβάλλοντα για τη γλώσσα C: τον gcc μεταγλωττιστή της C σε περιβάλλον
Η γλώσσα προγραμματισμού C
Η γλώσσα προγραμματισμού C Εισαγωγή στη C Λίγα λόγια για την C Γλώσσα προγραμματισμού υψηλού επιπέδου. Σχεδιάστηκε και υλοποιήθηκε από τον Dennis Richie στις αρχές της δεκαετίας του 1970 (Bell Labs). Η
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Μέθοδοι Παράδειγμα Θέλουμε ένα πρόγραμμα που να προσομοιώνει την κίνηση ενός αυτοκινήτου, το οποίο κινείται και τυπώνει τη θέση του.
Διαδικασιακός Προγραμματισμός
Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 7 η Πίνακες Οι διαλέξεις βασίζονται στο βιβλίο των Τσελίκη και Τσελίκα C: Από τη Θεωρία στην Εφαρμογή Σωτήρης Χριστοδούλου
«ΕΙΔΙΚΑ ΘΕΜΑΣΑ ΣΟΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟ ΤΠΟΛΟΓΙΣΩΝ» Κεφάλαιο 4: Αντικειμενοςτρεφήσ Προγραμματιςμόσ
«ΕΙΔΙΚΑ ΘΕΜΑΣΑ ΣΟΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟ ΤΠΟΛΟΓΙΣΩΝ» Κεφάλαιο 4: Αντικειμενοςτρεφήσ Προγραμματιςμόσ 1 4.1. Οριςμόσ φνθετων τφπων κλάςεων 2 Με εξαίρεςη τουσ βαςικούσ τύπουσ τησ Java (int, float, boolean, κλπ) τα
Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.
1 Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Χειµώνας 2005 ιάλεξη 5η Ιστοσελίδα του µαθήµατος 2 http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm Θα
Γραφικά υπολογιστών Εργαστήριο 10 Εισαγωγή στα Sprites
Γραφικά υπολογιστών Εργαστήριο 10 Εισαγωγή στα Sprites Σκοπός της 10ης άσκησης είναι να μάθουμε να χρησιμοποιούμε sprites και να φτιάξουμε ένα παιχνίδι που χρησιμοποιεί συγκρούσεις. Θα δούμε επίσης μερικά
Διαχείριση Ειδοποιήσεων με Κινητές Συσκευές
Διαχείριση Ειδοποιήσεων με Κινητές Συσκευές Λαμπαδαρίδης Αντώνιος el04148@mail.ntua.gr Διπλωματική εργασία στο Εργαστήριο Συστημάτων Βάσεων Γνώσεων και Δεδομένων Επιβλέπων: Καθηγητής Τ. Σελλής Περίληψη
ios Developing Κεφάλα Αικατερίνη Μουρίκης Ευάγγελος Επιβλέπων: Μηνάς Δασυγένης
ios Developing Κεφάλα Αικατερίνη Μουρίκης Ευάγγελος http://arch.icte.uowm.gr Επιβλέπων: Μηνάς Δασυγένης ios Συσκευές Λόγος επιλογής προγραμματισμού σε ios Δείγμα τελευταίων εκδόσεων Υιοθέτηση των IOS 6
Sheet2. Σωστή, και µπράβο που µεριµνήσατε για λίστες διαφορετικών µεγεθών.
Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ Δεν κάνει compile και το λάθος είναι σηµαντικό: Το head1 είναι δείκτης σε struct, εποµένως η προσπέλαση πεδίου γίνεται 321 FAIL µε head1->next και όχι head1.next. Επιπλέον, έχετε λάθος
ios Development Γκόγκος Χρήστος
ios Development Γκόγκος Χρήστος Λογισμικά Objective C Interface Builder Simulator Instruments XCODE Simulator Cmd + Shift + H Home button Cmd + K εμφάνιση/απόκρυψη πληκτρολογίου Δυνατότητα για περιστροφή
Εισαγωγή στην OpenGL
Εισαγωγή στην OpenGL Ε.1 Τι είναι η OpenGL; Ένας νέος χρήστης θα υποθέσει ότι η OpenGL είναι µια βιβλιοθήκη σχεδίασης γραφικών. Ωστόσο, µε τον όρο OpenGL δεν αναφερόµαστε σε µια συγκεκριµένη βιβλιοθήκη
2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008
Παράδειγμα: Μηχανή για Εισιτήρια 2 Ορισμός Κλάσεων Σύνταξη κλάσης: πεδία, κατασκευαστές, μέθοδοι Ένας αυτόματος εκδότης εισιτηρίων είναι μια μηχανή που δέχεται χρήματα και εκδίδει ένα εισιτήριο. Εκδίδει
FORTRAN και Αντικειμενοστραφής Προγραμματισμός
FORTRAN και Αντικειμενοστραφής Προγραμματισμός Παραδόσεις Μαθήματος 2016 Δρ Γ Παπαλάμπρου Επίκουρος Καθηγητής ΕΜΠ georgepapalambrou@lmentuagr Εργαστήριο Ναυτικής Μηχανολογίας (Κτίριο Λ) Σχολή Ναυπηγών
Προγραμματισμός ΙI (Θ)
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κεντρικής Μακεδονίας - Σέρρες Τμήμα Μηχανικών Πληροφορικής Προγραμματισμός ΙI (Θ) Δρ. Δημήτρης Βαρσάμης Επίκουρος Καθηγητής Μάρτιος 2017 Δρ. Δημήτρης Βαρσάμης Μάρτιος 2017
Βασικά Στοιχεία της Java
Βασικά Στοιχεία της Παύλος Εφραιμίδης 1 Βασικά Στοιχεία της γλώσσας Τύποι Δεδομένων Η έχει δύο κατηγορίες τύπων δεδομένων: πρωτογενείς (primitive) iti τύπους δεδομένων δδ αναφορές 2 Βασικά Στοιχεία της
ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ
ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ (Οι ερωτήσεις µε κίτρινη υπογράµµιση είναι εκτός ύλης για φέτος) ΕΙΣΑΓΩΓΗ Q1. Οι Πρωταρχικοί τύποι (primitive types) στη Java 1. Είναι όλοι οι ακέραιοι και όλοι οι πραγµατικοί
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Μέθοδοι Παράδειγμα 1 Θέλουμε ένα πρόγραμμα που να προσομοιώνει την κίνηση ενός αυτοκινήτου, το οποίο κινείται και τυπώνει τη θέση του.
Ειδικά Θέματα Προγραμματισμού
Ειδικά Θέματα Προγραμματισμού Ενότητα 2: Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό Μιχάλας Άγγελος Τμήμα Μηχανικών Πληροφορικής ΤΕ Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης
Προγραμματισμός Ι (ΗΥ120)
Προγραμματισμός Ι (ΗΥ120) Διάλεξη 9: Συναρτήσεις Ορισμός συναρτήσεων () { /* δήλωση μεταβλητών */ /* εντολές ελέγχου/επεξεργασίας */ o Μια συνάρτηση ορίζεται δίνοντας
Προγραμματισμός Η/Υ 1 (Εργαστήριο)
Προγραμματισμός Η/Υ 1 (Εργαστήριο) Ενότητα 2: Δομή ενός προγράμματος C Καθηγήτρια Εφαρμογών: Τσαγκαλίδου Ροδή Τμήμα: Ηλεκτρολόγων Μηχανικών Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες
Κεφάλαιο 7: Υλοποίηση εφαρμογών σε προγραμματιστικά περιβάλλοντα. Εφαρμογές Πληροφορικής Κεφ. 7 Καραμαούνας Πολύκαρπος 1
Κεφάλαιο 7: Υλοποίηση εφαρμογών σε προγραμματιστικά περιβάλλοντα Καραμαούνας Πολύκαρπος 1 Ανάπτυξη εφαρμογών για φορητές συσκευές: τείνουν να αντικαταστήσουν τους υπολογιστές και άλλες συσκευές. Τα δημοφιλέστερα
1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι
1 ΕΙΣΑΓΩΓΗ Η γλώσσα προγραµµατισµού Java είναι ισχυρά τυποποιηµένη (strongly typed), που σηµαίνει ότι κάθε µεταβλητή και κάθε έκφραση έχει κάποιο τύπο, ο οποίος πρέπει να είναι γνωστός κατά το χρόνο της
Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών
Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Σκοπός Να καταλάβουν την διαφορά ανάμεσα σε τοπικές και καθολικές μεταβλητές. Nα κάνουν αποσφαλμάτωση
Εγχειρίδιο Χρήστη - Μαθητή
Εγχειρίδιο Χρήστη - Μαθητή 1. Εισαγωγή Η ηλεκτρονική πλατφόρµα «e-class», αποτελεί ένα ολοκληρωµένο σύστηµα Ασύγχρονης Τηλεκπαίδευσης. Στόχος της είναι παροχή υποδοµών εκπαίδευσης και κατάρτισης ανεξάρτητα
ΠΛΗΡΟΦΟΡΙΚΗ Ι Εργαστήριο 1 MATLAB ΠΛΗΡΟΦΟΡΙΚΗ Ι ΕΡΓΑΣΤΗΡΙΟ 1. Θέμα εργαστηρίου: Εισαγωγή στο MATLAB και στο Octave
ΠΛΗΡΟΦΟΡΙΚΗ Ι ΕΡΓΑΣΤΗΡΙΟ 1 Θέμα εργαστηρίου: Εισαγωγή στο MATLAB και στο Octave Περιεχόμενο εργαστηρίου: - Το περιβάλλον ανάπτυξης προγραμμάτων Octave - Διαδικασία ανάπτυξης προγραμμάτων MATLAB - Απλά
Α. Ερωτήσεις Ανάπτυξης
οµηµένος Προγραµµατισµός-Κεφάλαιο 7 Σελίδα 1 α ό 10 ΕΝΟΤΗΤΑ ΙΙΙ (ΠΡΟΓΡΑΜΜΑΤΑ) ΚΕΦΑΛΑΙΟ 7: Είδη, Τεχνικές και Περιβάλλοντα Προγραµµατισµού Α. Ερωτήσεις Ανάπτυξης 1. Τι ονοµάζουµε γλώσσα προγραµµατισµού;
Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1
Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων Προγραμματισμός II 1 lalis@inf.uth.gr Βιβλιοθήκες Τμήματα λογισμικού ευρύτερης χρησιμότητας που έχουν σχεδιαστεί με σκοπό να διευκολύνουν την ανάπτυξη πολλών διαφορετικών
ΕΓΧΕΙΡΙΔΙΟ ΜΑΘΗΤΗ. της Πλατφόρμας Τηλεκατάρτισης
ΕΓΧΕΙΡΙΔΙΟ ΜΑΘΗΤΗ της Πλατφόρμας Τηλεκατάρτισης ΠΕΡΙΕΧΟΜΕΝΑ 1. Εισαγωγή...2 2. Αρχική σελίδα, Εισαγωγή & Περιβάλλον Συστήματος...3 2.1. Αρχική σελίδα εισαγωγής...3 2.2. Εισαγωγή στην Πλατφόρμα Τηλε-κατάρτισης...4
Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )
ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ Γεώργιος Παπαϊωάννου (2013-16) gepap@aueb.gr Περιγραφή: Μορφές μεταβίβασης ορισμάτων σε συναρτήσεις (και μεθόδους) και οι επιπτώσεις τους Επιστροφή τιμών από κλήση συναρτήσεων Υπερφόρτωση
Η βασική συνάρτηση προγράμματος main()
Η βασική συνάρτηση προγράμματος main() HEADER FILES main(){ ΔΗΛΩΣΕΙΣ ΜΕΤΑΒΛΗΤΩΝ ΕΝΤΟΛΕΣ (σειριακές, επιλογής ή επανάληψης) ΕΠΙΣΤΡΕΦΟΜΕΝΟΣ ΤΥΠΟΣ (return 0;) Συναρτήσεις Η συνάρτηση είναι ένα υποπρόγραμμα
Εγχειρίδιο Φοιτητών. 1. Εισαγωγή
Εγχειρίδιο Φοιτητών 1. Εισαγωγή Η ηλεκτρονική πλατφόρµα «e-class», αποτελεί ένα ολοκληρωµένο σύστηµα Ασύγχρονης Τηλεκπαίδευσης. Στόχος της είναι παροχή υποδοµών εκπαίδευσης και κατάρτισης ανεξάρτητα από
Σχήµα 6.1: Εισαγωγή της εντολής Read From Spreadsheet File στο Block Diagram.
Εισαγωγή αρχείων δεδοµένων 1. Η εισαγωγή αρχείων δεδοµένων στο LaVIEW γίνεται στο Block Diagram µε την εντολή Read From Spreadsheet File. 2. Εισάγουµε την εντολή Read From Spreadsheet File στο Block Diagram
J-GANNO. Σύντοµη αναφορά στους κύριους στόχους σχεδίασης και τα βασικά χαρακτηριστικά του πακέτου (προέκδοση 0.9Β, Φεβ.1998) Χάρης Γεωργίου
J-GANNO ΓΕΝΙΚΕΥΜΕΝΟ ΠΑΚΕΤΟ ΥΛΟΠΟΙΗΣΗΣ ΤΕΧΝΗΤΩΝ ΝΕΥΡΩΝΙΚΩΝ ΙΚΤΥΩΝ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ JAVA Σύντοµη αναφορά στους κύριους στόχους σχεδίασης και τα βασικά χαρακτηριστικά του πακέτου (προέκδοση 0.9Β,
Κεφάλαιο 3.5-3.6, 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ
Κεφάλαιο 3.5-3.6, 3.2: Συναρτήσεις II ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ 12-1 Ανασκόπηση οµής Προγράµµατος µε Συναρτήσεις #include 1 void PrintMessage (); Πρότυπο ( ήλωση) Συνάρτησης (
ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ
ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ Γεώργιος Παπαϊωάννου (2013-16) gepap@aueb.gr Περιγραφή: Deep/Shallow copies H αναγκαιότητα των κατασκευαστών αντιγραφής Ορισμός και χρήση κατασκευαστών αντιγραφής Τελευταία ενημέρωση:
C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο
C: Από τη Θεωρία στην Εφαρµογή Κεφάλαιο 2 ο Τύποι Δεδοµένων Δήλωση Μεταβλητών Έξοδος Δεδοµένων Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας Μνήµη και Μεταβλητές Σχέση Μνήµης Υπολογιστή και Μεταβλητών Η µνήµη (RAM) ενός
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι new Όπως είδαμε για να δημιουργήσουμε ένα αντικείμενο χρειάζεται να καλέσουμε τη new. Για τον πίνακα είπαμε ότι
Λειτουργικά. Τεχνολογικό Εκπαιδευτικό Ίδρυμα Δυτικής Μακεδονίας Σιώζιος Κων/νος - Πληροφορική Ι
Λειτουργικά Συστήματα 1 Λογισμικό του Υπολογιστή Για να λειτουργήσει ένας Η/Υ εκτός από το υλικό του, είναι απαραίτητο και το λογισμικό Το σύνολο των προγραμμάτων που συντονίζουν τις λειτουργίες του υλικού
Συνοπτικός Οδηγός Χρήσης του Moodle για τον Καθηγητή
Συνοπτικός Οδηγός Χρήσης του Moodle για τον Καθηγητή 1 Πίνακας Περιεχομένων 1. Εισαγωγή... 4 1.1 Περιβάλλον Moodle...4 1.2 Χρήση ονόματος χρήστη και κωδικού...4 1.3 Δημιουργία νέου μαθήματος...4 1.3.1
Κατανεμημένα Συστήματα
Κατανεμημένα Συστήματα Σημειώσεις εργαστηρίου Lab#7 - Διεργασίες, Nήματα, Πολυνημάτωση στη Python Νεβράντζας Βάιος-Γερμανός Λάρισα, Φεβρουάριος 2013 Lab#7 - Διεργασιές, Νη ματα, Πολυνημα τωση στη Python,
Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο
Προγραμματισμός Ι Δείκτες Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Τι είναι ο δείκτης Ένας δείκτης είναι μια μεταβλητή που περιέχει μια διεύθυνση μνήμης. Θυμηθείτε πως
Τύποι δεδομένων, τελεστές, μεταβλητές
Τύποι δεδομένων, τελεστές, μεταβλητές Βασικά στοιχεία της γλώσσας Η Java χαρακτηρίζεται από ένα αρκετά καλά οργανωμένο σύνολο εντολών κι ένα μέρος της επιτυχίας της οφείλεται στα διάφορα APIs (βιβλιοθήκες)
ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕ ΟΝΙΑΣ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕ ΟΝΙΑΣ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΞΑΜΗΝΟ Η ΟΝΟΜΑΤΕΠΩΝΥΜΟ ΦΟΙΤΗΤΗ : ΜΟΣΧΟΥΛΑ ΟΛΓΑ ΑΡΙΘΜΟΣ ΜΗΤΡΩΟΥ : 30/02 ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΘΕΜΑ : ΥΛΟΠΟΙΗΣΗ ΣΥΣΤΗΜΑΤΟΣ ΙΑΧΕΙΡΙΣΗΣ ΣΥΝΕ ΡΙΩΝ ΜΕ ΧΡΗΣΗ
Κεφάλαιο 10 ο Υποπρογράµµατα
Κεφάλαιο 10 ο Υποπρογράµµατα Ανάπτυξη Εφαρµογών σε Προγραµµατιστικό Περιβάλλον Η αντιµετώπιση των σύνθετων προβληµάτων και η ανάπτυξη των αντίστοιχων προγραµµάτων µπορεί να γίνει µε την ιεραρχική σχεδίαση,
1. O FrontPage Explorer
1. O FrontPage Explorer Στο παρελθόν, ο δηµιουργός µιας θέσης Ιστού έπρεπε να παρακολουθεί µόνος του τον τρόπο σύνδεσης των σελίδων του. Με το FrontPage Explorer µπορείτε να δηµιουργείτε ιστούς και να
Visual Flowchart Γενικά
Visual Flowchart 3.020 -Γενικά Το Visual Flowchart ή «Data-Flow Visual Programming Language 3.020» (http://www. emu8086.com/fp) είναι ένα περιβάλλον ανάπτυξης και εκτέλεσης αλγορίθμων απευθείας σε μορφή
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα ΑΝΑΦΟΡΕΣ new Όπως είδαμε για να δημιουργήσουμε ένα αντικείμενο χρειάζεται να καλέσουμε τη new. Για
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Αναφορές Μαθήματα από το lab Υπενθύμιση: Η άσκηση ζητούσε να υλοποιήσετε μία κλάση vector που να διαχειρίζεται διανύσματα οποιουδήποτε
ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 7/1/2014, 22:00
ΣΕΤ ΑΣΚΗΣΕΩΝ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2013-2014 Προθεσµία: 7/1/2014, 22:00 Περιεχόµενα Διαβάστε πριν ξεκινήσετε Εκφώνηση άσκησης 1 Οδηγίες αποστολής άσκησης Πριν ξεκινήσετε (ΔΙΑΒΑΣΤΕ
Πλάνο Παρουσίασης. Στο δεύτερο μέρος θα μελετήσουμε τον σχεδιασμό και κώδικα πίσω από την εφαρμογή.
Pong Game Project Επιβλέπων:Δασυγένης Μηνάς Φοιτητής:Τερζή Αναστασία Ιούνιος 2018,Κοζάνη Τμήμα Μηχανικών πληροφορικής και τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής Υπολογιστών http://arch.icte.uowm.gr/
Εισαγωγή στην εφαρμογή Βασική Σελίδα (Activity) Αναζήτηση Πελάτη... 6 Προβολή Πελάτη... 7 Επεξεργασία Πελάτη... 10
Περιεχόμενα Εισαγωγή στην εφαρμογή... 2 Βασική Σελίδα (Activity)... 3 Ρυθμίσεις... 3 Πελάτες... 6 Αναζήτηση Πελάτη... 6 Προβολή Πελάτη... 7 Επεξεργασία Πελάτη... 10 Αποθήκη... 11 Αναζήτηση προϊόντος...
Περίληψη ιπλωµατικής Εργασίας
Περίληψη ιπλωµατικής Εργασίας Θέµα: Πρότυπη Εφαρµογή ιαλειτουργικότητας για Φορητές Συσκευές Όνοµα: Κωνσταντίνος Χρηστίδης Επιβλέπων: Ιωάννης Βασιλείου Συν-επιβλέπων: Σπύρος Αθανασίου 1. Αντικείµενο Αντικείµενο
Υπολογιστικά Συστήματα
Υπολογιστικά Συστήματα Ενότητα 3: Βασικά στοιχεία της γλώσσας προγραμματισμού Visual Basic for Applications (VBA) Σαπρίκης Ευάγγελος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά) Άδειες Χρήσης Το παρόν εκπαιδευτικό
Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων
Δομημένος Προγραμματισμός Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων www.bpis.teicrete.gr Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων www.bpis.teicrete.gr 2 Ορισμός
Εγχειρίδιο Φοιτητών. 1. Εισαγωγή
Εγχειρίδιο Φοιτητών 1. Εισαγωγή Η ηλεκτρονική πλατφόρµα «e-class», αποτελεί ένα ολοκληρωµένο σύστηµα Ασύγχρονης Τηλεκπαίδευσης. Στόχος της είναι παροχή υποδοµών εκπαίδευσης και κατάρτισης ανεξάρτητα από
Εγχειρίδιο Φοιτητών. 1. Εισαγωγή
Εγχειρίδιο Φοιτητών 1. Εισαγωγή Η ηλεκτρονική πλατφόρµα «e-class», αποτελεί ένα ολοκληρωµένο σύστηµα Ασύγχρονης Τηλεκπαίδευσης. Στόχος της είναι παροχή υποδοµών εκπαίδευσης και κατάρτισης ανεξάρτητα από
ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΚΑΙ ΔΙΚΤΥΩΝ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ
ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΚΑΙ ΔΙΚΤΥΩΝ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2011-2012 ΕΡΓΑΣΙΑ ΕΞΑΜΗΝΟΥ Ποιος πρέπει να ολοκληρώσει αυτή την εργασία? Φοιτητές έτους >=2 που
Atlantis - Νέο user interface
New Desktop 1 Atlantis - Νέο user interface ATLANTIS - ΝΕΟ USER INTERFACE...2 ΓΕΝΙΚΗ ΠΑΡΟΥΣΙΑΣΗ...3 ΓΡΑΜΜΗ ΣΥΣΤΗΜΑΤΟΣ...4 ΜΠΑΡΑ ΧΡΗΣΤΗ (USER TOOLBAR)...5 ΚΕΝΤΡΙΚΟ ΜΕΝΟΥ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ...6 Κεντρικό μενού
Ελέγξτε την ταινία σας
Ελέγξτε την ταινία σας Σε αυτές τις ασκήσεις, θα κάνετε εισαγωγή μιας ταινίας και θα χρησιμοποιήσετε τις επιλογές που παρουσιάστηκαν στο μάθημα. Άσκηση 1: Εισαγωγή αρχείου ταινίας 1. Κάντε κλικ στη μικρογραφία
3 Αλληλεπίδραση Αντικειμένων
Αφαίρεση και Αρθρωσιμότητα 3 Αλληλεπίδραση Αντικειμένων Πώς συνεργάζονται τα αντικείμενα που δημιουργούμε Αφαίρεση (abstraction) είναι η δυνατότητα να αγνοούμε τις λεπτομέρειες και να εστιάζουμε την προσοχή
Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 4 - Editor
Προηγμένοι Μικροεπεξεργαστές Εργαστήριο 4 - Editor Περιγραφή Υλοποίηση ενός υποτυπώδους editor που θα: Διαβάζει ένα προκαθορισμένο αρχείο Θα το απεικονίζει στην οθόνη Θα κάνει highlight με έναν ελεγχόμενο
Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ
ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ Σχεδιασμός και υλοποίηση υποδομής σημείωσης διεργασιών στον
LASERJET ENTERPRISE FLOW MFP. Συνοπτικές οδηγίες χρήσης M525
LASERJET ENTERPRISE FLOW MFP Συνοπτικές οδηγίες χρήσης 2 M525 Εκτύπωση μιας αποθηκευμένης εργασίας Χρησιμοποιήστε την ακόλουθη διαδικασία για να εκτυπώσετε μια εργασία που είναι αποθηκευμένη στη μνήμη
FAIL PASS PASS οριακά
AEM 0001 0002 COMMENTS οριακά -Το πρόγραµµά σου δουλεύει λάθος για τις εισόδους: 7 -Δεν έχεις µεριµνήσει για την περίπτωση step=1. Μπορούσες να θεωρήσεις ειδική περίπτωση και να την υλοποιείς σε άλλον
Διαδικτυακό Περιβάλλον Διαχείρισης Ασκήσεων Προγραμματισμού
ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ ΔΙΑΤΜΗΜΑΤΙΚΟ ΜΕΤΑΠΤΥΧΙΑΚΟ ΠΡΟΓΡΑΜΜΑ ΣΤΑ ΠΛΗΡΟΦΟΡΙΑΚΑ ΣΥΣΤΗΜΑΤΑ Διπλωματική Εργασία με θέμα: Διαδικτυακό Περιβάλλον Διαχείρισης Ασκήσεων Προγραμματισμού Καραγιάννης Ιωάννης Α.Μ.
Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5
Περιεχόµενα 1 Εισαγωγή στις οµές εδοµένων 3 2 Στοίβα (Stack) 5 i ΠΕΡΙΕΧΟΜΕΝΑ ΠΕΡΙΕΧΟΜΕΝΑ ii Πληροφορίες Εργαστηρίου Σκοπός του εργαστηρίου Το εργαστήριο οµές εδοµένων αποσκοπεί στην εφαρµογή των τεχνολογιών
Οι δείκτες στη γλώσσα C
Οι δείκτες στη γλώσσα C Δείκτης είναι µία µεταβλητή η οποία περιέχει σαν τιµή µία διεύθυνση της µνήµης Η τιµή ενός δείκτη δείχνει σε µία άλλη µεταβλητή, η οποία µπορεί να προσεγγισθεί έµµεσα µε τους ειδικούς
ΗΜΙΟΥΡΓΙΑ ΙΣΤΟΣΕΛΙ ΑΣ ΣΤΟ MICROSOFT WORD
ΗΜΙΟΥΡΓΙΑ ΙΣΤΟΣΕΛΙ ΑΣ ΣΤΟ MICROSOFT WORD Σε ορισµένες περιπτώσεις είναι ιδιαίτερα χρήσιµη η δηµιουργία ιστοσελίδων ενηµερωτικού περιεχοµένου οι οποίες στη συνέχεια µπορούν να δηµοσιευθούν σε κάποιο τόπο