PracticU

עבודה עם קבצים ב-Xcode - חלק 2

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode › עבודה עם קבצים ב-Xcode - חלק 2
מילון מושגים:
Xcode - סביבת הפיתוח של אפל לכתיבת אפליקציות ל-iOS ול-macOS.
API - ממשק תכנותי שמגדיר כיצד תוכנה אחת פונה לאחרת ומחליפה איתה נתונים ופעולות.
בינארי - ייצוג מידע בבסיס 2 בעזרת הספרות 0 ו-1. גם קובץ הכולל קוד מכונה ולא טקסט קריא.
Integer - סוג נתונים למספר שלם, כלומר מספר ללא חלק עשרוני.
View - רכיב שאחראי על הצגת המידע למשתמש (התצוגה) בדפוס MVC. גם טבלה וירטואלית מבוססת שאילתה במסד נתונים.
קונטרולר - רכיב שמתווך בין הממשק לבין הלוגיקה והנתונים, מקבל בקשות ומחליט כיצד לטפל בהן (למשל בדפוס MVC).
בנאי - מתודה מיוחדת שמופעלת אוטומטית בעת יצירת אובייקט ממחלקה, ומאתחלת את ערכיו ההתחלתיים.
שם משתמש - מזהה ייחודי שמשתמש מזין כדי להזדהות במערכת, לרוב יחד עם סיסמה.

עבודה עם קבצים ב-Xcode - חלק 2
אחרי עבודה עם קבצים, השיעור מציג את User Defaults, אובייקט שנותן API נוח לשמירה ושליפה של מידע בסיסי. הדוגמה היא מסך login שנפתח בפעם הראשונה ושומר שם, מצב רוח ותמונת פרופיל.
איך זה עובד
ב-User Defaults שומרים עם פעולות set: מידע בינארי, מחרוזות, תאריכים, מערכים, מילונים, מספרים ו-Bool. כל ערך נשמר תחת key. טוענים עם פעולות כמו string(forKey:), integer(forKey:) או data(forKey:). אפשר לשמור גם אובייקטים מותאמים, אבל צריך להמיר אותם קודם, וזה נושא לשיעור אחר. הרפרנס לאובייקט מתקבל מ-UserDefaults.standard.
השלבים העיקריים
1. מחלקה נפרדת: יוצרים DefaultsManager, מחלקה ולא struct, כי רוצים אובייקט משותף שמועבר ב-reference. ב-View Controller מגיבים לאירועים ולא כותבים בו לוגיקת שמירה.
2. שמירה וטעינה: בדמו שומרים שם ומספר ומחזירים אותם. הפעולה שמחזירה מחרוזת מחזירה אופציונל, ולכן מציבים ערך "not set". מספר שלא נשמר חוזר כ-0.
3. סינגלטון: תכונה סטטית shared שמכילה מופע של המחלקה, ובנאי private. מבחוץ אפשר להגיע רק דרך DefaultsManager.shared.
4. מסך login: View Controller חדש ב-Storyboard שמוצג modal דרך segue, עם text field לשם, segmented control עם שלושה מצבי רוח, image view וכפתור Done, עם אילוצים של 16.
5. לחיצה על התמונה: image view אינו מגיב ללחיצות כברירת מחדל, ולכן מפעילים User Interaction Enabled ומוסיפים Tap Gesture Recognizer עם action.
6. הצגת ה-segue: נותנים ל-segue identifier ומפעילים אותו מתוך viewDidAppear ולא מ-viewDidLoad, אם אין שם משתמש שמור.
7. בחירת תמונה: UIImagePickerController שה-delegate שלו הוא ה-login view controller. מממשים את UIImagePickerControllerDelegate ו-UINavigationControllerDelegate ב-extension, ובשני המקרים (ביטול ובחירה) עושים dismiss.
8. שליפת התמונה: מתוך ה-info לוקחים את editedImage או originalImage. עם allowsEditing = true אפשר לחתוך את התמונה לפני הבחירה.
9. שמירה בלחיצה על Done: שומרים את השם, את selectedSegmentIndex ואת התמונה כ-pngData, ואחר כך סוגרים את המסך. בהרצה הבאה מודפס "היי" עם השם השמור.
שימו לב
התמונה היא UIImage ולא נשמרת ישירות, ולכן ממירים אותה ל-Data. בקוד הדמו לא נבדק שהשם אינו ריק, וזה נשאר כתרגיל. שיעורי הבית: מסך עריכה של הפרטים ואפשרות מחיקה.
בסוף השיעור אפשר לשמור פרטי משתמש, כולל תמונה, ב-User Defaults ולטעון אותם בהפעלה הבאה.
השיעור הבא בקורס: סריאליזציה של אובייקט ב-Xcode-Swift

פרקי ההרצאה: עבודה עם קבצים ב-Xcode - חלק 2

  1. 00:00

    שמירת מידע עם User Defaults

  2. 00:54

    טעינת מידע וקבלת רפרנס לאובייקט

  3. 01:30

    פרויקט חדש ומחלקת DefaultsManager

  4. 03:23

    שמירה וטעינה של שם וגיל

  5. 05:57

    הפיכת המחלקה לסינגלטון

  6. 08:11

    מסך לפרטי המשתמש בסטוריבורד

  7. 10:16

    כפתור ואילוצים במסך החדש

  8. 13:10

    זיהוי לחיצה על התמונה

תמלול ההרצאה: עבודה עם קבצים ב-Xcode - חלק 2

הטקסט המלא של הדקות הראשונות בהרצאה «עבודה עם קבצים ב-Xcode - חלק 2» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    שלום וברוכים הבאים בשיעורים הקודמים ראינו איך לשמור מידע בקבצים והיום אנחנו רוצים לעבור לשמור מידע באובייקט של סוויפט שנקרא user defaults הuser defaults בעצם מקל עלינו את העבודה עם שמירת מידע ומאפשר לנו API מאוד נוח לשמירה ולהחזור של מידע אז בואו נבדוק איזה מתודות יש על האובייקט

  2. 00:22

    הזה כדי לשמור מידע אנחנו נרצה להשתמש במתודות set של אובייקט user defaults וכשאנחנו עושים set אנחנו יכולים לשמור את הסוגים הבאים של מידע אנחנו יכולים לשמור מידע בינארי, אנחנו יכולים לשמור סטרינגים, אנחנו יכולים לשמור תאריכים, מערכים, דיקשנריס וגם כן

  3. 00:40

    מספרים, כמו שאפשר לראות כאן, ובוליאנים כמובן. בנוסף, אפשר לשמור Custom Objects אבל בשביל זה צריך להעביר אותם איזשהו תהליך ואנחנו נדבר על זה גם כן.

  4. 00:53

    אז זה הרעיון, אנחנו רוצים לשמור מידע ולהשתמש במשהו נוח בשביל לעשות את זה, קוראים לזה User Defaults. לטעון מידע זה באותו אופן בסדר אם כשאנחנו שומרים מידע אנחנו קוראים לפעולה set אז כדי לטעון מידע אנחנו פונים לפעולות array for key או boolean for key או data for key וכן הלאה דבר אחרון שרציתי להגיד לפני שניגש לפרויקט

  5. 01:13

    זה שכדי לעבוד עם הuser defaults אנחנו קודם כל צריכים לקבל רפרנס לאובייקט וכדי לעשות את זה אנחנו משתמשים בuser defaults נקודה סטנדרט שנותן לנו בעצם איזשהו סינגל טון או shared instance אז בוא ניגש לאקסקוד כאן אנחנו רוצים לייצר פרויקט חדש לשיעור אז File New Project ואנחנו נרצה ל-Single View-Up ולשמור את זה בתיקייה של הפרויקטים, נקרא לדבר הזה User

  6. 01:41

    Defaults Demo ואנחנו נתקדם פה. עכשיו בפרויקט שלנו אנחנו רוצים להיכנס, אפשר לעשות את הכל ב-View Controller נכון? ואנחנו רוצים לאט לאט ללמוד שב-View Controller לא עובדים עם מידע, עם דאטה וכן הלאה, אלא ב-View Controller אנחנו יכולים לבדוק דברים שכתבנו בקבצים אחרים. אנחנו רוצים לעשות

  7. 02:10

    איזושהי חלוקה של מודל View וקונטרולר, כשב-view-controller אנחנו מגיבים לאירועים וכך הלאה, ואנחנו לא כל כך רוצים ב-view-controller לכתוב לוגיקה של עבודה עם קבצים.

  8. 02:21

    לכן יהיה יותר נבון לעבוד עם user-defaults וקובץ נפרד. אז בואו נעשה את זה. בפרויקט אנחנו נרצה לייצר קובץ חדש, swift-file, ובוא נקרא לזה defaults-manager.

  9. 02:40

    כאן אנחנו נרצה לייצר קלאס עבור ה-defaults-manager שלנו, אז class defaults-manager, ואנחנו לא רוצים לרשת פה משום דבר. הסיבה שאנחנו עושים קלאס ולא סטראקט היא שאנחנו רוצים להפוך את האובייקט הזה לאובייקט משותף בכל האפליקציה וסטראקטים מועברים לפי עותק בעוד שאובייקטים מועברים לפי רפרנס אז קלאס הפעם.

  10. 03:01

    עכשיו מבחינת הקלאס בואו נתחיל פה במשתנה בעצם כמו שהיה לנו את הפייל מנאג'ר בפרויקט הקודם אז כאן יהיה לנו את הדפולט והוא יהיה שווה לuserDefaults.standard אוקיי ככה אנחנו בעצם מקבלים רפרנס לאובייקט המדובר ref to the userDefaults.

  11. 03:21

    עכשיו מה אנחנו רוצים לעשות עם זה? אז אנחנו נרצה לשמור מידע, נכון? בוא נדגים פה איזשהו דמו, נעשה איזשהו פאנקשן ואחר כך נמחק אותו, של שמירת מידע.

  12. 03:31

    אז בוא נגיד saveDemo, אז נניח שאנחנו רוצים לשמור userName כלשהו, אז let name שווה motion ו-let h שווה נגיד 20 שזה יהיה מספר. ועכשיו החלטנו שאנחנו רוצים לשמור את motionUserDefault אז כדי לשמור אותו אנחנו נקרא לה פעולות של set של רגע קודם.

  13. 03:55

    זה לא משנה באיזה אנחנו בוחרים, מה שכן משנה זה שיש לנו פה את המידע ואת השם של המשתנה שאנחנו רוצים לשמור אז בוא נגיד אנחנו רוצים לקרוא לזה מייניים או משהו איזשהו אידנטיפייר ופה אנחנו שמים את הוואליו אז אני אשים את הערך שאנחנו רוצים לשמור ובאותו אופן אני אתיק ואדביק את זה אנחנו נרצה

  14. 04:13

    לשמור את ה-h אוקיי אז כאן אנחנו שמים את הערך וכאן אנחנו שמים את ה-key אז mh זה ה-key בעצם אוקיי אז שמרתי יפה עכשיו איך אנחנו טוענים את המידע נניח שאנחנו רוצים לטעון את המידע אז בוא נעשה פה לואוד דה דאטה וכדי לטעון את המידע אנחנו משתמשים בפעולות ההפוכות defaults נקודה value for key או יש לנו

  15. 04:38

    string for key עבור סטרינגים אז בואו נעשה את זה קראנו למשתנה m name אז אנחנו צריכים בדיוק בדיוק לדייק כאן וזה ייתן לי סטרינג אולי אז let name from disk שווה לדבר הזה עכשיו למה אני אומר אולי כי יכול להיות שעדיין לא שמרנו אותו נכון אז המתודה הזאת מחזירה פה אופציונל אז בואו נעשה לזה נעיל כל אסינג ונכתוב not set ובאותו אופן אנחנו יכולים לטעון את ה-h אז let h from

  16. 05:12

    disk שווה defaults.infokey והפעם אנחנו קראנו לזה mh אז שוב פעם נדייק אחרת אז בוא נעשה פה נגיד 0 או מספר שלילי אנחנו נרצה להדפיס את זה אז print name from disk ובוא נעשה גם פסיק ונדפיס את h from disk אם זה מצליח וכמובן שזה אמור להצליח אז אנחנו נראה שכל הדבר הזה מדפיס פה את שתי הפרמטרים.

  17. 05:45

    סליחה, לגבי אינטג'ר זה אף פעם לא יהיה ניל, אנחנו תמיד נקבל פה ערך, מקסימום באמת נקבל אפס. אז אם זה יצליח אנחנו נדפיס את זה ונראה את המידע.

  18. 05:57

    אבל מה שאנחנו רוצים לעשות, אנחנו רוצים להפוך את האובייקט הזה לסינגלטון. סינגלטון אומר שאני רוצה בעצם להשתמש באותו אובייקט בכל האפליקציה.

  19. 06:06

    איך אנחנו יכולים להפוך את האובייקט שלנו לסינגלטון, אתם שואלים? התשובה היא מאוד מאוד פשוטה. נעשה דבר כזה, יהיה לנו משתנה סטטי מהסוג של המחלקה שאנחנו נמצאים בה, נגיד קראנו למחלקה שלנו defaults-manager אז defaults-manager ובואו נקרא למשתנה שלנו shared ונגיד שהוא שווה ל-defaults-manager חדש.

  20. 06:29

    בגלל שזה משתנה סטטי אז יהיה אפשר להגיד defaults-manager.shared ולהגיע לאינסטנס. כדי שאף אחד לא ייצור מופעים של המחלקה שלנו בטעות אז בואו נייצר בנאי אבל הבנאי שלנו יהיה פרייבט זאת אומרת שהבנאי לא נגיש ובצורה הזאת בעצם יצרנו לעצמנו סינגלטון בוא נראה מה זה אומר ואיך עובדים גם עם סינגלטון החבאנו את הבנאי בעצם ובנוסף חשפנו תכונה של משתנה ואז טיפוס של defaults manager אז

  21. 07:01

    אנשים לא יכולים ליצור מופע מבחוץ ובמקום ליצור מופע מבחוץ הם נאלצים להגיד defaults manager.shared כדי לגשת למתודה של save demo בוא נבדוק איך זה עובד אז אנחנו רוצים להשתמש במחלקה שלנו defaults manager ואנחנו יכולים לראות שאין לנו עינית בעצם העינית הוא לא חשוף הוא פרייבט והדבר היחיד שאנחנו יכולים כרגע לעשות זה כדי

  22. 07:22

    להגיע לאובייקט זה ללחוץ על share ואז אנחנו מגיעים לאובייקט המשותף הסטאטי שיצרנו ומכאן אנחנו יכולים להגיע לתכונות defaults ולsave demo שזה הפעולה בעצם וזה דווקא מה שאנחנו רוצים לעשות אז אני מפעיל את זה ואז אנחנו נוכל לראות האם הצלחנו לשמור את המידע וגם להחזיר אותו בעזרת הuser

  23. 07:40

    defaults ושימו לב עד כמה הדבר הזה פשוט יחסית לעבודה של סינון עם קבצים. יפה, אז אני רואה פה את הערכים ששמרתי לדיסק, והעבודה עם user defaults היא סופר פשוטה.

  24. 07:50

    אז הרשינו לעצמנו לעשות פה סינגלטון, שזה נהדר. זה דבר שאתם תמיד רוצים לעשות, בגלל שפה יש לכם בעזרת סינגלטון אובייקט אחד משותף לכל האפליקציה, שבעזרתו אתם שומרים את המידע ומטעינים את המידע וכן הלאה.

  25. 08:05

    עכשיו אנחנו לא רוצים להשאיר אתכם פעם כזה פרויקט סתמי שבערך עובד, הוא עובד יפה אבל אתם רוצים קצת לשחק עם זה מעבר ואנחנו רוצים גם ללמוד איך לשמור נתונים כמו תמונות ואיך לשמור נתונים כמו custom objects שלכם.

  26. 08:21

    אז בואו נתחיל עכשיו עם הפרויקט שלנו ונלך ל-storyboard רגע. נגיד שאנחנו רוצים לשמור מידע על המשתמש שלנו, למשל איך קוראים לו ותמונת פרופיל.

  27. 08:31

    אז מה שאנחנו נעשה, אנחנו נייצר עוד view controller אחד כדי לשאול אותו את כל הפרטים האלה. אז אני מחפש בוויו קונטרולר ולחצתי פה על קלוס ובוויו קונטרולר החדש שעשינו אנחנו נעביר אליו בעצם סגווי בעזרת קונטרול וגרירה ואנחנו נציג אותו בצורה מודלית זאת אומרת שהוא יוצג מעל כן כמו שזה מוצג פה יפה אז מה שאנחנו נרצה

  28. 08:56

    לשאול את המשתמש נגיד בפעם הראשונה שהוא נכנס לאפליקציה זה איך קוראים לו אז בואו נשים טקסט פילד אחד בשביל זה כמובן שאפשר לעבוד פה על הייצוא ולעשות את זה ממש מקסים ומדהים אבל אני רוצה לחסוך בזמן ופשוט לתת לכם את העיקר אז אני אקח UI segmented control בשביל ככה איזה שהם מספרים להראות

  29. 09:19

    דוגמאי מספרים גם ואני אמתח את ה-UI segmented control עד לטקסט פילד ואני רוצה שיהיה לי פה שלוש סגמנטים אז הגדלתי את מספר הסגמנטים לשלוש ובטייטלס בוא נגיד שאנחנו שואלים אותו מה מצב הרוח שלו אז happy, sad, ובוא נגיד כזה משהו פארו וכזה אז אני אלך

  30. 09:43

    פה לסגמנט השלישי ובטקסט בוא נגיד מה אוקיי אז יש לי את השם של המשתמש בוא נגיד שנשים פה פלייס הולדר שהוא יבחר שם ומתחת לזה אנחנו רוצים גם תמונת פרופיל אז בואו נוסיף אימג' ויו כדי שגם נוכל לראות את התמונה וגם נוכל לבחור אותה ובוא נגיד שהאימג' ויו צריך לתפוס פה את רוב המסך ובנוסף לאימג' ויו זה אנחנו גם נרצה כפתור כדי להגיד שסיימנו אז הנה הכפתור פה ואני ארצה לגרור את

  31. 10:27

    כפתור על כל המסך בוא נעבוד טיפה על אילוצים אז מבחינת אילוצים נתחיל בכפתור דווקא אני אלחץ על הוספת אילוצים ונצמיד אותו לצדדים ולפינה התחתונה נגיד עם שוליים של 16 אז הכפתור שלי במקום אני אתן לו איזשהו background כדי שנוכל לראות אותו בגלל שהוא תופס פה את כל השטח אז בוא נגיד סתם נצבע אותו פה באיזשהו צבע נחמד

  32. 10:57

    והטקסט שלו במקרה כזה צריך להיות לבן אז אני אדאג לזה גם ובכפתור בוא נגיד done עכשיו לגבי ה-image view מבחינת אילוצים אז אנחנו רוצים להצמיד אותה גם כן לכל ארבע פינות עם שוליים של 16. אתם יודעים שיהיו פה ענייני קונפליקטים של מי רוצה לתפוס את המקום המיותר אז עוד מעט נטפל בזה.

  33. 11:37

    לגבי ה-segmented control נעגן אותו לטקסט פילד אז נתחיל בטקסט פילד הטקסט פילד ילך למעלה ולשתי הצדדים עם 16 שוליים וה-segmented control יהיה מתחתיו גם כן עם 16 שוליים אז 16 ללמעלה לצדדים ועכשיו נגיד לתמונה שהיא תתפוס את כל המקום המיותר למרות שהיא כנראה כבר יודעת את זה אבל כדאי פשוט ללכת לכאן ולהגיד מבחינת

  34. 12:10

    התמונה אנחנו לא רוצים לחבק גם לא בציר x ויותר חשוב מזה בציר y היא לא רוצה לחבק ואין לה בעיה גם להתכווץ במידת הצורך התמונה תהיה זאת שמתפשרת על מקום במידת האפשר עכשיו בתמונה פה אנחנו רוצים לשים איזושהי תמונה שהיוזר ידע שהוא צריך לבחור תמונה כמובן שאפשר לכתוב פה איזשהו טקסט גם אבל בוא נמצא

  35. 12:33

    פלייס אולדר אימאג' באייקון סייט ובזה נשתמש אז נמצא את האייקון סייט בוא נחפש אימאג' אני אשים את התמונה הזאת באסטס נגיד ניקח את זאת היא תראה לא משהו אבל בסדר ואנחנו נשים אותה פה בסורי בורד בחזרה באימאג' אוקיי היוזר שלנו היינו צריכים לבחור בתמונה עם רזולוציה יותר טובה אבל הבנו את הרעיון היוזר שלנו ירצה ללחוץ כאן על התמונה בשביל

  36. 13:17

    לבחור את התמונה שלו. תמונות לצערנו הן לא נגישות מבחינת קליקים הן אפילו לא User Interaction Enabled by default זאת אומרת שאם אני רוצה להגיב ללחיצות על תמונה אין עליה אפשרות כזאת בסדר אני לא יכול להגיב ללחיצות על תמונה ומה שאני כן יכול לעשות זה להוסיף מעל התמונה UI Tap Gesture Recognizer אז אנחנו מחפשים Tap Gesture Recognizer

  37. 13:40

    שהוא זה שיעזור לנו לזהות קליקים על התמונה זה לא יעבוד אם לא קודם כל דאגנו שהתמונה תהיה User Interaction Enabled ודאגנו לזה אז עכשיו הכל בסדר אוקיי אז יש לנו פה כל מיני פקדים נחמדים וזה יהיה הדיאלוג שאנחנו מקפיצים למשתמש אם הוא אף פעם לא יתחבר.

  38. 13:58

    מה שכן, אנחנו רוצים לייצר לזה קלאס ולקשר תכונות, אז בואו נעשה את זה. אני עושה קליק ימני ב- Group, New File. אנחנו רוצים CocoTouch קלאס שיורש מ-ViewController, אז בואו נקרא לזה LoginViewController נניח, והוא יורש מ-UaViewController ונעשה פה אישור.

  39. 14:20

    עכשיו, בסטורי בורד, בגלל שיצרנו ViewController חדש, צריך לתת לו את הקלאס הזה שיצרנו עכשיו, אז בואו נמצא פה את ה-LoginViewController, הפקדים שלנו אז אנחנו

לקורס המלא: קורס פיתוח אפליקציות לאייפון

ההרצאה הקודמת: עבודה עם קבצים ב-Xcode - חלק 1

ההרצאה הבאה: סריאליזציה של אובייקט ב-Xcode-Swift

הרצאות קשורות מקורסים אחרים

  • עבודה עם קבצים ב-NodeJS
  • עבודה עם VI - חלק 1
  • עבודה עם קבצים של אקסל בתוך Qlik - חלק 1
  • עבודה עם קבצים בג'אווה - Reading Properties File

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון