UISearchController ומציבים אותו ב-navigationItem.searchController. המחלקה היא ה-delegate של המפה ושל ה-Search Bar. ב-searchBarSearchButtonClicked לוקחים את הטקסט, בודקים שאינו ריק, וסוגרים את החיפוש עם isActive = false.CLGeocoder().geocodeAddressString ממיר טקסט למערך placemarks. לוקחים את הראשון, יוצרים ממנו Annotation (שם המקום ואזור מנהלי ככותרת משנה), מוסיפים למפה ועושים זום. את הזום מבצעים עם MKCoordinateRegion סביב המיקום, ברדיוס של 1000 מטר, ו-setRegion. בדוגמה חיפוש בעברית הוביל לבאר שבע.isMonitoringLocation כ-private(set), ומערך steps פרטי של מיקומים. מגדירים activityType לכושר, distanceFilter (בדוגמה 100 מטר, או none לכל תזוזה) ו-desiredAccuracy. דיוק גבוה צורך יותר סוללה.start מפעיל את הדגל, מרוקן את steps ואם יש הרשאה קורא ל-startUpdatingLocation. stop מכבה את הדגל וקורא ל-stopUpdatingLocation.didUpdateLocations מוסיפים את המיקומים ל-steps, ושולחים Notification בשם חדש עם userInfo שבו המיקום האחרון, כדי שמסכים אחרים יוכלו להאזין.steps מוציאים את coordinate של כל נקודה, יוצרים MKPolyline (הבנאי מקבל מצביע למערך קואורדינטות וכמות), ומוסיפים אותו כ-overlay. ב-rendererFor overlay של ה-delegate מחזירים MKPolylineRenderer עם lineWidth ו-strokeColor. כדי שיוצג רק המסלול האחרון, מסירים את ה-overlay הקודם לפני הוספת החדש.motionBegan בודקים אם התנועה היא shake, ויוצרים Annotation במיקום הנוכחי. ב-viewFor annotation מחזירים nil למה שאינו שלנו, וממחזרים תצוגות עם dequeueReusableAnnotationView ו-reuse identifier. לתצוגה החדשה נותנים כפתור callout ותמונה של נעל ריצה בגודל כ-25 פיקסלים. בסימולטור מנענעים דרך Hardware, Shake Gesture.sortPlaces מקבל מיקום, ו-Notification Center מאזין לעדכוני המיקום ב-main queue, עם weak self, ממיין מחדש בכל עדכון.הטקסט המלא של הדקות הראשונות בהרצאה «ניטור מיקום המשתמש וציור מסלול קוי על המפה» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלנו וברוכים הבאים בחלק הזה והוא האחרון במודול שלנו אנחנו רוצים לממש את הוויו קונטרולר של לוקיישן המודול הזה וכאן בעצם אתם יכולים לראות שיש פה חיפוש עכשיו החיפוש הוא לא בטייבל וויו קונטרולר כמו שראינו בעבר אלא זה חיפוש עם וויו קונטרולר רגיל אז אנחנו קודם כל נרצה להתחיל לממש פה את החיפוש לתת למשתמש לחפש
כתובת ולדעת מה מיקום ואפשר להציג אותו על המפה ולהציג את זה על המפה עם זום אז בואו נתחיל רגע בזה, אנחנו נתחיל פה לעצב את המסך, כפתור פה ב-Map View, נוסיף את המסך כמובן כטאבים כי כרגע הוא לא מופיע בפרויקט.
אז אנחנו נעשה פה פלוס View Controller אחרון בפרויקט ונשים אותו נגיד פה. עכשיו ה-View Controller הזה רצוי שהוא יהיה ב-Navigation כדי שיהיה אפשר להוסיף לו חיפוש וכן הלאה, אז הכנסנו אותו לתוך Navigation Controller וכל הדבר הזה אנחנו עושים פה ואנחנו נרצה להוציא סגווי מהתא בר
קונטרולר לנב קונטרולר שכאן וזה כמובן ריליישנשיפ סגווי view קונטרולר יפה עכשיו התמונה פה אייקון כאן אנחנו נעמוד פה על האייטם ובצד ימין בתכונות אנחנו נחפש תמונה מתאימה יש תמונה של לוקיישן בסיסטם images אז היא תמונה טובה ניקח אותה והנה יש לנו כבר את האייטם כאן אנחנו רוצים קצת לעצב אחר כך נייצר לזה קלאס ונוציא
מבחינת ייצור ואין לנו פה המון אנחנו פשוט רוצים להוסיף כפתור של סטארט וסטופ אוקיי נשים את הכפתור נגיד פה באיזשהם שוליים גדולים מלמעלה ומבחינת ציר X אני ארצה פשוט למרכז אותו ונוסיף רק אילוץ אחד ואני אוסיף מריכוז אופקי יש עכשיו בגודל של הפונד בוא
נגדיל את זה משמעותית נגיד 32 פה ככה נבחר נגדיל את זה מאוד אוקיי ובוא נכתוב פה במקום בטון נכתוב פה פשוט סטארט כשעל חוץ מדי יש לנו map view אז בואו נוסיף map view ואנחנו נרצה פשוט לאלץ אותו לכל מה שנשאר מהמסך אז בואו ניקח שוליים של 888 לכל מה שנשאר אז זאת בעצם המפה שלנו איך מפה אנחנו מתקדמים בקונטרולרים אנחנו רוצים לייצר לזה קונטרולר אז אנחנו נעשה קליק ימני
new file ואנחנו רוצים קודם כל קלאס שיורש מ ui view קונטרולר הפעם ואנחנו נקרא לזה לוקיישן view קונטרולר את הקלאס הזה צריך לקשר לסטורי וורד אז Back to the Storyboard כאן אתם רוצים לעמוד על הרצאות ללכת ל-Identity Inspector בצד ימין ולבחור בקלאס שלכם Allocation View Controller מעולה עכשיו אנחנו נלך פה למעלה לבורגר לאיפה שכתוב Just Editor Options
ואנחנו רוצים לפתוח את האסיסטנט עכשיו אנחנו נלך פה לאוטומטיק ונבחר את הקלאס שיצר ה-Allocation View Controller מעולה אז נוציא ל-The Action לכפתור אוקיי רק נדאג שזה אקשן ונשנה את ה-apply-o-a-button אני אקרא לזה tagel user-location ויותר מאוחר אנחנו נעשה את המימוש של הפעולה עכשיו חוץ
מזה אנחנו רוצים להוציא outlet למפטיו נכון אז הנה יש לנו פה את המפטיו והוצאנו אליו פשוט את ה-outlet וכשמוציאים outlet אז צריך אימפורטות אתם בטח כבר זוכרים ל-mapkit נכון אז בואו נוסיף אותו נהדר עכשיו מה לגבי החיפוש אתם בטח שואלים את עצמכם נכון זאת זאת אומרת אני מריץ את
זה פה ואין חיפוש בטייבל ויו קונטרולר סליחה בטייבל ויו קונטרולר היינו יכולים לעשות פה פלוס רגע נראה לכם את זה שוב טייבל ויו קונטרולר היינו יכולים לעשות פה פלוס להוסיף search bar לתוך הטייבל ויו אבל פה זה לא טייבל ויו קונטרולר ואין פה איזה שהוא מקום לזה אפשר לעבוד עם זה גם כן אבל אנחנו רוצים לראות דרך
יותר יפה במקרה כזה מקרה שכזה שאין לכם טייבל ויותר לא מוסיפים סארצ' באר אלא מוסיפים את החיפוש מהקוד למעשה ועכשיו אנחנו נראה איך עושים את זה כדי לעשות את זה אנחנו נגדיר פשוט משתנה מסוג סארצ' קונטרולר אוקיי ui סארצ' קונטרולר אז אנחנו נגדיר אותו פה ברמת המחלקה מתחת
לתכונה הזאת נגיד let search קונטרולר שווה ל ui סארצ' קונטרולר חדש עכשיו יש פה את ה ui סארצ' רזלטס קונטרולר ואנחנו לא צריכים אחד כזה אז אנחנו נעביר בוניל וזה זה בעיניי שאנחנו צריכים להשתמש בו, אוקיי? לא לבחור באף מנה אחר, זה בדרך כלל לא יעבוד לנו.
אז יצרנו את ה-search-controller ב-view-did-load אנחנו רוצים קודם כל להיות ה-delegate של ה-map-view עצמו, אז בואו נגיד map-view.delegate שווה ל-self, בגלל שאנחנו עובדים עם מפה אנחנו רוצים להיות ה-delegate שלה, וזה מצריך אותנו להוסיף לזה extension, אז בואו נוסיף אותו כבר עכשיו כדי שלא נשכח אחר כך.
extension ל-location-view-controller שאני נמצא בו, כדי לממש את MKMFViewDelegate אוקיי מה עוד אנחנו רוצים לעשות כאן אנחנו רוצים גם להיות הדלגייט של הסרצ' קונטרולר אוקיי יש לי פה סרצ' קונטרולר זה די דומה לחיפושים שעשינו בעבר אז אני ככה מניח שאתם בסדר עם זה על הסרצ' קונטרולר יש לו את הסרצ' באר ואנחנו רוצים להיות הדלגייט של הסרצ' באר פשוט אותו דבר כמו שעשינו בעבר
שווה לסיים ואם ככה אנחנו צריכים לממש את הפרוטוקול נכון אני אסגור רגע את ה-toury board כי האמת היא שאנחנו לא צריכים אותו יותר, השארנו אותו פה כדי לדבר על זה, אז עכשיו אנחנו נוכל לראות ככה את המסך בצורה יותר טובה.
צריך לממש UASearchBarDelegate גם כן, אז אנחנו נממש extension ל-location-vcontroller שאנחנו נמצאים בו כדי לממש את ה-searchBarDelegate.
יפה, בואו נראה אם אנחנו צריכים פה עוד משהו. אנחנו אולי רוצים פשוט להציג את המיקום של המשתמש על המפה, בוא נגיד mapview.showsuserlocation שווה למה?
בוא ניקח את ה-location-manager שלנו, share ואם יש רשות אז true אחרת false אוקיי אז האם המפה צריכה להציג מיקום אם יש רשות זו התשובה שלנו יפה מאוד אז אנחנו גם מציגים את המיקום של המשתמש אם אפשר וה-search-controller שלנו לא יוצג עדיין נכון הוספנו יצרנו מופע של search-controller ואמרנו שאנחנו רוצים להיות ה-delegate
אבל הדבר האחרון שנשאר לנו לעשות פה בעצם זה להגיד בוא נוסיף את הסרצ' קונטרולר הזה שלנו לנביגיישן אייטם אז self.navigationitem searchcontroller שווה לסרצ' קונטרולר שיצרנו יפה מאוד אז בעצם עכשיו אנחנו יכולים כבר להריץ ולראות שאמור להיות לנו איזה שהוא חיפוש צ'יק באפליקציה הוא עדיין לא עובד יותר מדי
אבל אנחנו לאט לאט נעשה את זה בשלבים יש לנו פה באייטם אתם רואים זה הסרצ' הוספנו אותו מהקוד וזה מגניב אני לוחץ פה יש דים, יש כפתור של קנסל וכמובן המקלדת נפתחת למשתמש אז מצוין.
דרך אגב אם לא נפתחת לכם המקלדת אז אתם מוזמנים פשוט hardware tagel keyboard בטלפון אמיתי היא נפתחת אצלי פשוט כתוב connect hardware keyboard אז פשוט תעשו tagel software keyboard ותרים אותה במקלדת ואתם יכולים לכתוב פה אבל רגע אנחנו לוחצים על search לא מחפש לא מוחק את הטקסט אז כל הקטע הבא הוא בדלגייט
נכון? ב-search bar delegate אנחנו פשוט רוצים להוסיף את המתודה של clicked יש שם פשוט כפתור והם קראו לו הפעם clicked search bar search clicked אוקיי זה מה שמעניין אותנו ואנחנו רוצים לקחת את הטקסט אז בואו ניקח את הטקסט guard let text שווה ל-search bar נקודה טקסט וגם בואו נבדוק שהאורך
של הטקסט בוא נגיד גדול מתו אחד או גדול מאפס תווים אחרת return אוקיי פנטסטי אז יש לנו כבר טקסט זה מה שאנחנו רוצים לחפש עכשיו אנחנו רוצים רפרנס לסרצ' קונטרולר עצמו ואני לא רואה אותו כאן אז איך אנחנו משיגים רפרנס לסרצ' קונטרולר האמת יש אותו בנוויגיישן
אייטם נכון? navigationitem.searchcontroller וברגע שיש לי את הnavigationitem.searchcontroller אנחנו רוצים להגיד is active false ומה שזה עושה זה עושה לו דיסמיס למעשה אוקיי ובוא נעשה רגע פריט לטקסט אחר כך נמשיך אני גם ארשום לנו פה ב-a זה דיסמיס ופה הוצאנו את הטקסט והדפסנו אותו אז אנחנו הולכים רגע לסרצ'
מחפשים פה משהו motion ועשינו enter אז יש לי פה פרינט למשה וגם עשינו dismiss מגניב אוקיי עכשיו מה נשאר לנו לעשות זה לחפש את המיקום הזה איכשהו נכון כדי לחפש את המיקום אנחנו רוצים להשתמש באובייקט שנקרא Geocoder Geocoder עוזר לנו לקחת טקסט ולהמיר אותו לקואורדינטות שזה מגניב אז בואו נלמד את זה אז עבודה עם Geocoder let Coder שווה Geocoder חדש או CL Geocoder אם אתם רוצים ככה זה השם המלא שלו ו-Once יש
לכם Coder Geocoder אתם רוצים לתת לו את ה-String שלכם אוקיי? איבדתי פה רגע את ההשלמה האוטומטית במקרים כאלה צריך פשוט לפתוח את Xcode או לעשות Command B ואצלי זה יסתדר ככה Geocode Address String אני יכול לתת לו פשוט לתת לו String והוא ייתן לנו Address בוא ננסה את זה עכשיו מה ה-Address
String זה הטקסט שלנו נכון? וה completion handler זה פשוט בלוק אז בואו נעשה פה אינטרנט. הוא נותן לי מערך של place marks לבקש הוא רוצה יותר מאחד אז בוא נקרא לזה place mark array כדי שנבין שזה מערך ו-error optional אוקיי עכשיו בוא נעשה weak self-in כי אנחנו לא רוצים שמישהו יחזיק
אלינו strong reference אוקיי ומה אנחנו עכשיו עושים בעצם אז בוא נוציא את ה-place מה-place array גארד ל-place שווה ל-place array נקודה first ולט לוקיישן שווה לפלייס הזה נקודה לוקיישן אחרת לא הצלחנו נכון אז אנחנו יכולים להוציא הודעה שלא הצלחנו אני פשוט אעשה פה כרגע ריטר מעולה אז יש לנו את
הפלייס ויש לנו את הלוקיישן אוקיי אז ברגע שיש לכם לוקיישן אתם פשוט רוצים לייצר אנוטציה אז לט הנוטיישן אנחנו נייצר פה mk בוא ניצר את הנוטיישן שלנו נכון יש לנו סאב פלאס של הנוטיישן שהוא יותר נוח מזה של אפל אז בואו אני אצר את זה שלנו אנחנו ניקח פה את המלא ומבחינת לוקיישן עצמו הקואורדינטות אז זה לוקיישן נקודה קואורדינט מבחינת הטייטל אנחנו ניקח את הלוקיישן ניים
או את הפלייס ניים סליחה ומבחינת הסאב טייטל בואו ניקח פשוט את הפלייס נקודה אדמיניסטרי דיבריה שזה כמו כזה ריצ'ה דרום צפון וכן הלאה אז יש לנו אנוטציה אנחנו רוצים להוסיף אותה למפה אז self אם אתה קיים, זאת אומרת optional self.mapview.addannotation.
אוקיי? יפה מאוד. אז בואו נראה רגע את כל הדבר הזה בפעולה מה שנקרא, רגע רגע רגע רגע רגע, כאן הקומפיילר מתלונן שכאילו לא השתמשנו בgeocoder, אתם רואים? אבל השתמשנו בו, אז עוד פעם עשיתי command+b והכל בסדר.
עכשיו עוד משהו שאתם רוצים לעשות לפני שאנחנו עוזבים את זה, אני מציע שכן. אני מציע גם שנעשה זום אין למפה כדי שנראה את המקום בצורה יותר טובה אוקיי אז בואו נעשה איזושהי פונקציה זום אין לריצ'ן או סט ריצ'ן נקרא לה שהיא תקבל פשוט קואורדינטות
או לוקיישן אוקיי ותציג אותו תעשה לו זום אין איך אנחנו עושים את הזום אין הזה אנחנו מייצרים mk coordinate ריצ'ן let ריצ'ן שווה mk coordinate ריצ'ן וכאן אנחנו נבחר בוונאי שמקבל center point אוקיי אז זה זה לוקיישן נקודה קואורדינייטס ואיזשהו מרחק נגיד אלף מטר סביב
הנקודה רדיוס כזה של לונגיטוד ולטיטוד זה ה-region ואנחנו רוצים בעצם להגיד למפה שלנו ככה להתקבע על ה-region הזה אז mapview.setregion תיכנסי ל-region אם אני