Nghiên cứu và xây dựng phần mềm bản đồ tìm kiếm đường đi cho hệ điều hành IOS

92 389 0
Nghiên cứu và xây dựng phần mềm bản đồ tìm kiếm đường đi cho hệ điều hành IOS

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

MỤC LỤC LỜI CAM ĐOAN 1 LỜI CẢM ƠN 2 MỞ ĐẦU 1 CHƯƠNG 1: TỔNG QUAN HỆ ĐIỀU HÀNH IOS VÀ NGÔN NGỮ LẬP TRÌNH SWIFT 3 1.1. Tổng quan về IOS 3 1.1.1 Giới thiệu về hệ điều hành IOS 3 1.1.2 Sự phát triển của iOS 4 1.2 Tổng quan về ứng dụng iOS 7 1.2.1 Cấu trúc ứng dụng iOS 7 1.2.2 Các trạng thái của ứng dụng iOS 9 1.2.3 Vòng đời của UIViewController 11 1.3. Ngôn ngữ lập trình Swift 12 1.3.1.Giới thiệu về ngôn ngữ Swift. 14 1.3.2. Array và Dictionary (Mảng và Từ điển) 18 1.3.3. Cấu trúc điều khiển 19 1.3.4. Hàm 20 1.3.5. Closure (Kết thúc) 21 1.3.6. Enumeration ( Liệt kê) 22 1.3.7. Classes and Structure (Lớp và cấu trúc) 23 1.3.8. Subscript 24 1.3.9. Inheritance(Kế Thừa) 25 1.3.10. Subclass(lớp con) 26 1.3.11. Mothod and Property (phương thức và thuộc tính) 26 1.3.12. Handling Error (đối phó với lỗi) 27 CHƯƠNG 2: PHÂN TÍCH THIẾT KẾ ỨNG DỤNG TÌM ĐƯỜNG ĐI 28 2.1. Mô tả bài toán 28 2.2. Quy trình nghiệp vụ. 28 2.3. Yêu cầu chức năng 28 2.4. Yêu cầu phi chức năng 29 2.5. Liệt kê tác nhân và ca làm việc của ứng dụng. 29 2.5.1. Đặc tả các ca làm việc 29 2.5.2. Biểu đồ Use case đặc tả ca làm việc của ứng dụng 31 2.6. Sơ đồ Use case các chức năng của ứng dụng 32 2.6.1. Sơ đồ Use case chức năng hiển thị bản đồ 32 2.6.2. Sơ đồ Use case chức năng định vị vị trí thiết bị 32 2.6.3. Sơ đồ Use case chức năng định vị các địa điểm tham chiếu 32 2.6.4. Sơ đồ use case chức năng tìm kiếm chỉ đường 33 2.6.5. Sơ đồ use case chức năng tìm kiếm đường đi ngắn nhất 33 2.7. Biểu đồ tuần tự 33 2.7.1. Biểu đồ tuần tự định vị vị trí hiện tại 33 2.7.2. Biểu đồ tuần tự định vị các địa điểm tham chiếu khác 34 2.7.3. Biểu đồ tuần tự tìm kiếm đường đi ngắn nhất 35 2.8. Biểu đồ hoạt động 37 2.8.1. Biểu đồ hoạt động định vị vị trí hiện tại 37 2.8.2. Biểu đồ hoạt động định vị các địa điểm tham chiếu 38 2.8.3. Biểu đồ hoạt động tìm kiếm chỉ đường 39 CHƯƠNG 3: XÂY DỰNG CHƯƠNG TRÌNH ỨNG DỤNG BẢN ĐỒ TÌM KIẾM ĐƯỜNG ĐI 40 3.1. Thiết kế chương trình ứng dụng 40 3.1.1. Xcode IDE 40 3.1.2. Playground trong swift 43 3.1.4. File viewcontroller 51 3.1.5. File code AddressTableView 52 3.1.6. File Code DirectionsViewController 52 3.1.7. Config Project 53 3.1.8. File code DirectionsTableView 54 3.2. Thiết kế giao diện của ứng dụng 54 3.2.1. Giao diện chính chỉ đường 54 3.2.2. Giao diện hiển thị kết quả 55 3.2.3. Giao diện nhập điểm đầu cuối 56 3.2.4. Giao diện tìm kiếm địa điểm 57 3.2.5. Giao diện màn hình chỉ đường chi tiết 57 KẾT LUẬN 59 TÀI LIỆU THAM KHẢO 60 PHỤ LỤC 61

LỜI CAM ĐOAN Em xin cam đoan đề tài nghiên cứu riêng em hướng dẫn khoa học TS Trần Cảnh Dương Các nội dung nghiên cứu, kết đề tài trung thực chưa công bố hình thức trước Những số liệu bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giá tác giả thu thập từ nguồn khác có ghi rõ phần tài liệu tham khảo Ngoài ra, đồ án sử dụng số nhận xét, đánh số liệu tác giả khác, quan tổ chức khác có trích dẫn Nếu phát có gian lận em xin hoàn toàn chịu trách nhiệm nội dung đồ án Trường đại học Tài nguyên Môi trường Khoa Công nghệ thông tin không liên quan đến vi phạm tác quyền, quyền em gây trình thực (nếu có) Em xin chân thành cảm ơn! Sinh viên Nguyễn Quốc Toản LỜI CẢM ƠN Trên thực tế thành công mà không gắn liền với giúp đỡ người dù hay nhiều, dù trực tiếp hay gián tiếp Trong suốt thời gian học tập trình làm đồ án, em nhận nhiều quan tâm giúp đỡ nhiệt tình thầy cô, bạn bè gia đình Đầu tiên em xin gửi lời cảm ơn sâu sắc đến thầy TS Trần Cảnh Dương, thầy trực tiếp hướng dẫn giúp đỡ em nhiều thời gian em làm khóa luận Em xin gửi lời cảm ơn đến thầy TS Hà Mạnh Đào, Trưởng khoa công nghệ thông tin, thầy cô giáo Khoa Công nghệ thông tin nhiệt tình giúp đỡ em trình học tập trường Cuối cùng, em xin gửi lời cảm ơn chân thành tới gia đình bạn bè giúp đỡ, động viên tạo điều kiện tốt cho em suốt trình học tập sống Vì lực có hạn nên báo cáo em nhiều hạn chế tránh khỏi thiếu sót, mong thầy cô bạn có ý kiến đóng góp để em hoàn thiện phát triển đề tài Em xin chân thành cảm ơn! Sinh viên Nguyễn Quốc Toản MỤC LỤC LỜI CAM ĐOAN LỜI CẢM ƠN MỞ ĐẦU CHƯƠNG 1: TỔNG QUAN HỆ ĐIỀU HÀNH IOS VÀ NGÔN NGỮ LẬP TRÌNH SWIFT 1.1 Tổng quan IOS 1.1.1 Giới thiệu hệ điều hành IOS 1.1.2 Sự phát triển iOS 1.2 Tổng quan ứng dụng iOS 1.2.1 Cấu trúc ứng dụng iOS 1.2.2 Các trạng thái ứng dụng iOS 1.2.3 Vòng đời UIViewController 10 1.3 Ngôn ngữ lập trình Swift 12 1.3.1.Giới thiệu ngôn ngữ Swift .13 1.3.2 Array Dictionary (Mảng Từ điển) 17 1.3.3 Cấu trúc điều khiển 18 1.3.4 Hàm .19 1.3.5 Closure (Kết thúc) .20 1.3.6 Enumeration ( Liệt kê) 21 1.3.7 Classes and Structure (Lớp cấu trúc) 22 1.3.8 Subscript 23 1.3.9 Inheritance(Kế Thừa) 24 1.3.10 Subclass(lớp con) 24 1.3.11 Mothod and Property (phương thức thuộc tính) 25 1.3.12 Handling Error (đối phó với lỗi) .25 2.1 Mô tả toán 26 2.2 Quy trình nghiệp vụ 26 2.3 Yêu cầu chức 26 2.4 Yêu cầu phi chức 27 2.5 Liệt kê tác nhân ca làm việc ứng dụng 27 2.5.1 Đặc tả ca làm việc 27 2.5.2 Biểu đồ Use case đặc tả ca làm việc ứng dụng .29 2.6 Sơ đồ Use case chức ứng dụng 29 2.6.1 Sơ đồ Use case chức hiển thị đồ 29 2.6.2 Sơ đồ Use case chức định vị vị trí thiết bị 30 2.6.3 Sơ đồ Use case chức định vị địa điểm tham chiếu .30 2.6.4 Sơ đồ use case chức tìm kiếm đường 31 2.6.5 Sơ đồ use case chức tìm kiếm đường ngắn .31 2.7 Biểu đồ 31 2.7.1 Biểu đồ định vị vị trí 31 2.7.2 Biểu đồ định vị địa điểm tham chiếu khác 32 2.7.3 Biểu đồ tìm kiếm đường ngắn .33 2.8 Biểu đồ hoạt động 35 2.8.1 Biểu đồ hoạt động định vị vị trí 35 2.8.2 Biểu đồ hoạt động định vị địa điểm tham chiếu 36 2.8.3 Biểu đồ hoạt động tìm kiếm đường .37 CHƯƠNG 3: XÂY DỰNG CHƯƠNG TRÌNH ỨNG DỤNG BẢN ĐỒ TÌM KIẾM ĐƯỜNG ĐI 38 3.1 Thiết kế chương trình ứng dụng 38 3.1.1 Xcode IDE 38 3.1.2 Playground swift 41 3.1.4 File viewcontroller 49 3.1.5 File code AddressTableView .50 3.1.6 File Code DirectionsViewController 50 3.1.7 Config Project 51 3.1.8 File code DirectionsTableView 52 3.2 Thiết kế giao diện ứng dụng .52 3.2.1 Giao diện đường 52 3.2.2 Giao diện hiển thị kết 53 3.2.3 Giao diện nhập điểm đầu cuối .54 3.2.4 Giao diện tìm kiếm địa điểm .55 3.2.5 Giao diện hình đường chi tiết 55 KẾT LUẬN 57 TÀI LIỆU THAM KHẢO .58 PHỤ LỤC 59 DANH MỤC BẢNG LỜI CAM ĐOAN LỜI CẢM ƠN MỞ ĐẦU CHƯƠNG 1: TỔNG QUAN HỆ ĐIỀU HÀNH IOS VÀ NGÔN NGỮ LẬP TRÌNH SWIFT 1.1 Tổng quan IOS 1.1.1 Giới thiệu hệ điều hành IOS 1.1.2 Sự phát triển iOS 1.2 Tổng quan ứng dụng iOS 1.2.1 Cấu trúc ứng dụng iOS Hình 1.1 Các đối tượng ứng dụng iOS 1.2.2 Các trạng thái ứng dụng iOS Hình 1.2 Vòng đời ứng dụng iOS 10 1.2.3 Vòng đời UIViewController 10 Hình 1.3 Vòng đời UIViewController 11 1.3 Ngôn ngữ lập trình Swift 12 Hình 1.4 Ngôn ngữ lập trình Swif 12 Hình 1.5 Đoạn mã lệnh viết Swif 13 1.3.1.Giới thiệu ngôn ngữ Swift .13 1.3.2 Array Dictionary (Mảng Từ điển) 17 1.3.3 Cấu trúc điều khiển 18 1.3.4 Hàm .19 1.3.5 Closure (Kết thúc) .20 1.3.6 Enumeration ( Liệt kê) 21 1.3.7 Classes and Structure (Lớp cấu trúc) 22 1.3.8 Subscript 23 1.3.9 Inheritance(Kế Thừa) 24 1.3.10 Subclass(lớp con) 24 1.3.11 Mothod and Property (phương thức thuộc tính) 25 1.3.12 Handling Error (đối phó với lỗi) .25 2.1 Mô tả toán 26 2.2 Quy trình nghiệp vụ 26 2.3 Yêu cầu chức 26 2.4 Yêu cầu phi chức 27 2.5 Liệt kê tác nhân ca làm việc ứng dụng 27 2.5.1 Đặc tả ca làm việc 27 Bảng 2.1 Đặc tả ca làm việc truy cập ứng dụng 27 Ca làm việc nhập thông tin địa điểm đặc tả bảng 2.2 .28 Bảng 2.2 Đặc tả ca làm việc nhập thông tin địa điểm 28 Bảng 2.3 Đặc tả ca làm việc định vị địa điểm tham chiếu .28 Ca làm việc tìm kiếm đường đặc tả bảng 2.4 .28 Bảng 2.4 Đặc tả ca làm việc tìm kiếm đường 28 2.5.2 Biểu đồ Use case đặc tả ca làm việc ứng dụng .29 Hình 2.1 Biểu đồ Use case đặc tả ca làm việc ứng dụng .29 2.6 Sơ đồ Use case chức ứng dụng 29 2.6.1 Sơ đồ Use case chức hiển thị đồ 29 Hình 2.2 Sơ đồ use case chức hiển thị đồ 30 2.6.2 Sơ đồ Use case chức định vị vị trí thiết bị 30 Hình 2.3 Sơ đồ use case chức định vị vị trí 30 2.6.3 Sơ đồ Use case chức định vị địa điểm tham chiếu .30 Hình 2.4 Sơ đồ use case chức định vị địa điểm tham chiếu 31 2.6.4 Sơ đồ use case chức tìm kiếm đường 31 2.6.5 Sơ đồ use case chức tìm kiếm đường ngắn .31 Hình 2.6 Sơ đồ use case chức tìm kiếm đường ngắn .31 2.7 Biểu đồ 31 2.7.1 Biểu đồ định vị vị trí 31 Hình 2.7 Biểu đồ định vị vị trí .32 2.7.2 Biểu đồ định vị địa điểm tham chiếu khác 32 Hình 2.8 Biểu đồ định vị địa điểm tham chiếu 33 2.7.3 Biểu đồ tìm kiếm đường ngắn .33 Hình 2.9 Biểu đồ tìm kiếm đường ngắn .34 2.8 Biểu đồ hoạt động 35 2.8.1 Biểu đồ hoạt động định vị vị trí 35 Hình 2.10 Biểu đồ hoạt động định vị vị trí 35 2.8.2 Biểu đồ hoạt động định vị địa điểm tham chiếu 36 Hình 2.11 Biểu đồ hoạt động định vị địa điểm tham chiếu 36 2.8.3 Biểu đồ hoạt động tìm kiếm đường .37 Hình 2.12 Biểu đồ hoạt động tìm kiếm đường 37 CHƯƠNG 3: XÂY DỰNG CHƯƠNG TRÌNH ỨNG DỤNG BẢN ĐỒ TÌM KIẾM ĐƯỜNG ĐI 38 3.1 Thiết kế chương trình ứng dụng 38 3.1.1 Xcode IDE 38 Hình 3.1 Giao diện làm việc Xcode 39 3.1.2 Playground swift 41 Hình 3.2 khởi tạo file .41 Hình 3.3 Nhập tên file 42 Hình 3.4 Hiển thị giao diện code 42 Hình 3.5 Màn hình playground .43 Hình 3.6 Hiển thị file Playground 44 Hình 3.7 Màn hình Utilities 45 Hình 3.8 Màn hình Editor .45 Hình 3.9 Định dạng comment Playground 46 Hình 3.10 Hướng dẫn sử dụng Playground 47 Hình 3.11 Cửa sổ thể kết .48 Hình 3.12 Cửa sổ kết 48 Hình 3.13 Cấu trúc thư mục project .49 3.1.4 File viewcontroller 49 3.1.5 File code AddressTableView .50 Hình 3.15 File code AddressTableView 50 3.1.6 File Code DirectionsViewController 50 Hình 3.16 File Code DirectionsViewController 51 3.1.7 Config Project 51 Hình 3.17 Config Project .51 3.1.8 File code DirectionsTableView 52 Hình 3.18 file code DirectionsTableView .52 3.2 Thiết kế giao diện ứng dụng .52 3.2.1 Giao diện đường 52 Hình 3.19 Giao diện đường .53 3.2.2 Giao diện hiển thị kết 53 Hình 3.20 Giao diện hiển thị kết 54 3.2.3 Giao diện nhập điểm đầu cuối .54 Hình 3.21 Giao diện nhập điểm đầu điểm cuối 55 3.2.4 Giao diện tìm kiếm địa điểm .55 Hình 3.22 Giao diện tìm kiếm địa điểm .55 3.2.5 Giao diện hình đường chi tiết 55 Hình 3.23 Giao diện hình đường chi tiết 56 Kết luận chương: chương đề cập tới ứng dụng sử dụng Mapkit làm sở liệu cho ứng dụng thiết kế ứng dụng, giao diện trân thực Ngoài ra cách tạo Project Xcode Xcode IDE 56 KẾT LUẬN 57 TÀI LIỆU THAM KHẢO .58 PHỤ LỤC 59 DANH MỤC HÌNH ẢNH Hình 1.1 Các đối tượng ứng dụng iOS Hình 1.2 Vòng đời ứng dụng iOS 10 Hình 1.3 Vòng đời UIViewController 11 Hình 1.4 Ngôn ngữ lập trình Swift .12 Hình 1.5 Đoạn mã lệnh viết Swift .13 Bảng 2.1 Đặc tả ca làm việc truy cập ứng dụng 27 Ca làm việc nhập thông tin địa điểm đặc tả bảng 2.2 .28 Bảng 2.2 Đặc tả ca làm việc nhập thông tin địa điểm 28 Bảng 2.3 Đặc tả ca làm việc định vị địa điểm tham chiếu .28 Ca làm việc tìm kiếm đường đặc tả bảng 2.4 28 Bảng 2.4 Đặc tả ca làm việc tìm kiếm đường 28 Hình 2.1 Biểu đồ Use case đặc tả ca làm việc ứng dụng .29 Hình 2.2 Sơ đồ use case chức hiển thị đồ .30 Hình 2.3 Sơ đồ use case chức định vị vị trí 30 Hình 2.4 Sơ đồ use case chức định vị địa điểm tham chiếu 31 Hình 2.6 Sơ đồ use case chức tìm kiếm đường ngắn 31 Hình 2.7 Biểu đồ định vị vị trí 32 Hình 2.8 Biểu đồ định vị địa điểm tham chiếu 33 Hình 2.9 Biểu đồ tìm kiếm đường ngắn .34 Hình 2.10 Biểu đồ hoạt động định vị vị trí 35 Hình 2.11 Biểu đồ hoạt động định vị địa điểm tham chiếu 36 Hình 2.12 Biểu đồ hoạt động tìm kiếm đường .37 Hình 3.1 Giao diện làm việc Xcode .39 Hình 3.2 khởi tạo file 41 Hình 3.3 Nhập tên file 42 Hình 3.4 Hiển thị giao diện code 42 Hình 3.5 Màn hình playground 43 67 return cell! } } extension Float { func format(_ f: String) -> String { return NSString(format: "%\(f)f" as NSString, self) as String } } extension CLLocationDistance { func miles() -> String { let miles = Float(self)/1609.344 return miles.format(".2") } } extension TimeInterval { func formatted() -> String { let formatter = DateComponentsFormatter() formatter.unitsStyle = full formatter.allowedUnits = [NSCalendar.Unit.hour, NSCalendar.Unit.minute, NSCalendar.Unit.second] return formatter.string(from: self)! } } 68 DirectionsViewController import UIKit import MapKit import CoreLocation class DirectionsViewController: UIViewController { @IBOutlet weak var mapView: MKMapView! @IBOutlet weak var totalTimeLabel: UILabel! @IBOutlet weak var directionsTableView: DirectionsTableView! var activityIndicator: UIActivityIndicatorView? var locationArray: [(textField: UITextField?, mapItem: MKMapItem?)]! override func viewDidLoad() { super.viewDidLoad() directionsTableView.contentInset = UIEdgeInsetsMake(-36, 0, -20, 0) addActivityIndicator() calculateSegmentDirections(0, time: 0, routes: []) } func addActivityIndicator() { activityIndicator = UIActivityIndicatorView(frame: UIScreen.main.bounds) activityIndicator?.activityIndicatorViewStyle = whiteLarge activityIndicator?.backgroundColor = view.backgroundColor activityIndicator?.startAnimating() view.addSubview(activityIndicator!) 69 } func calculateSegmentDirections(_ index: Int, time: TimeInterval, routes: [MKRoute]) { // let request: MKDirectionsRequest = MKDirectionsRequest() request.source = locationArray[index].mapItem request.destination = locationArray[index+1].mapItem // request.requestsAlternateRoutes = true // request.transportType = automobile // let directions = MKDirections(request: request) directions.calculate (completionHandler: { (response: MKDirectionsResponse?, error: NSError?) in if let routeResponse = response?.routes { let quickestRouteForSegment: MKRoute = routeResponse.sorted(by: {$0.expectedTravelTime < $1.expectedTravelTime})[0] // var timeVar = time var routesVar = routes //2 routesVar.append(quickestRouteForSegment) // timeVar += quickestRouteForSegment.expectedTravelTime // 70 if index+2 < self.locationArray.count { self.calculateSegmentDirections(index+1, time: timeVar, routes: routesVar) } else { self.hideActivityIndicator() self.showRoute(routesVar, time: timeVar) } } else if let _ = error { let alert = UIAlertController(title: nil, message: "Directions not available.", preferredStyle: alert) let okButton = UIAlertAction(title: "OK", style: cancel) { (alert) -> Void in self.navigationController?.popViewController(animated: true) } alert.addAction(okButton) self.present(alert, animated: true, completion: nil) } } as! MKDirectionsHandler) } func printTimeToLabel(_ time: TimeInterval) { var timeString = time.formatted() totalTimeLabel.text = "Total Time: \(timeString)" } func showRoute(_ routes: [MKRoute], time: TimeInterval) { 71 var directionsArray = [(startingAddress: String, endingAddress: String, route: MKRoute)]() for i in MKOverlayRenderer! { let polylineRenderer = MKPolylineRenderer(overlay: overlay) if (overlay is MKPolyline) { if mapView.overlays.count == { polylineRenderer.strokeColor = UIColor.blue.withAlphaComponent(0.75) } else if mapView.overlays.count == { polylineRenderer.strokeColor = UIColor.green.withAlphaComponent(0.75) } else if mapView.overlays.count == { polylineRenderer.strokeColor = UIColor.red.withAlphaComponent(0.75) } polylineRenderer.lineWidth = } return polylineRenderer } } ViewController import UIKit import MapKit import CoreLocation 74 class ViewController: UIViewController { @IBOutlet weak var sourceField: UITextField! @IBOutlet weak var destinationField1: UITextField! @IBOutlet weak var destinationField2: UITextField! @IBOutlet weak var topMarginConstraint: NSLayoutConstraint! @IBOutlet var enterButtonArray: [UIButton]! var originalTopMargin: CGFloat! let locationManager = CLLocationManager() var locationTuples: [(textField: UITextField?, mapItem: MKMapItem?)]! var locationsArray: [(textField: UITextField?, mapItem: MKMapItem?)] { var filtered = locationTuples.filter({ $0.mapItem != nil }) filtered += [filtered.first!] return filtered } override func viewDidLoad() { super.viewDidLoad() originalTopMargin = topMarginConstraint.constant locationManager.delegate = self locationManager.requestWhenInUseAuthorization() 75 if CLLocationManager.locationServicesEnabled() { locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters locationManager.requestLocation() } locationTuples = [(sourceField, nil), (destinationField1, nil), (destinationField2, nil)] } override func viewWillAppear(_ animated: Bool) { navigationController?.isNavigationBarHidden = true } override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool { if locationTuples[0].mapItem == nil || (locationTuples[1].mapItem == nil && locationTuples[2].mapItem == nil) { showAlert("Please enter a valid starting point and at least one destination.") return false } else { return true } } 76 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let directionsViewController = segue.destination as! DirectionsViewController directionsViewController.locationArray = locationsArray } @IBAction func getDirections(_ sender: AnyObject) { view.endEditing(true) performSegue(withIdentifier: "show_directions", sender: self) } @IBAction func addressEntered(_ sender: UIButton) { view.endEditing(true) // let currentTextField = locationTuples[sender.tag-1].textField // CLGeocoder().geocodeAddressString(currentTextField!.text!, completionHandler: {(placemarks: [CLPlacemark]?, error: NSError?) -> Void in if let placemarks = placemarks { var addresses = [String]() for placemark in placemarks { addresses.append(self.formatAddressFromPlacemark(placemark)) } self.showAddressTable(addresses, textField: currentTextField!, 77 placemarks: placemarks, sender: sender) } else { self.showAlert("Address not found.") } } as! CLGeocodeCompletionHandler) } @IBAction func swapFields(_ sender: AnyObject) { swap(&destinationField1.text, &destinationField2.text) swap(&locationTuples[1].mapItem, &locationTuples[2].mapItem) swap(&self.enterButtonArray.filter{$0.tag == 2}.first!.isSelected, &self.enterButtonArray.filter{$0.tag == 3}.first!.isSelected) } func formatAddressFromPlacemark(_ placemark: CLPlacemark) -> String { return (placemark.addressDictionary!["FormattedAddressLines"] as! [String]).joined(separator: ", ") } 78 func showAddressTable(_ addresses: [String], textField: UITextField, placemarks: [CLPlacemark], sender: UIButton) { let addressTableView = AddressTableView(frame: UIScreen.main.bounds, style: UITableViewStyle.plain) addressTableView.addresses = addresses addressTableView.currentTextField = textField addressTableView.placemarkArray = placemarks addressTableView.mainViewController = self addressTableView.sender = sender addressTableView.delegate = addressTableView addressTableView.dataSource = addressTableView view.addSubview(addressTableView) } func showAlert(_ alertString: String) { let alert = UIAlertController(title: nil, message: alertString, preferredStyle: alert) let okButton = UIAlertAction(title: "OK", style: cancel) { (alert) -> Void in } alert.addAction(okButton) present(alert, animated: true, completion: nil) } // The remaining methods handle the keyboard resignation/ // move the view so that the first responders aren't hidden 79 func moveViewUp() { if topMarginConstraint.constant != originalTopMargin { return } topMarginConstraint.constant -= 165 UIView.animate(withDuration: 0.3, animations: { () -> Void in self.view.layoutIfNeeded() }) } func moveViewDown() { if topMarginConstraint.constant == originalTopMargin { return } topMarginConstraint.constant = originalTopMargin UIView.animate(withDuration: 0.3, animations: { () -> Void in self.view.layoutIfNeeded() }) } } //extension extension ViewController: UITextFieldDelegate { 80 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { enterButtonArray.filter{$0.tag == textField.tag}.first!.isSelected = false locationTuples[textField.tag-1].mapItem = nil return true } func textFieldDidBeginEditing(_ textField: UITextField) { moveViewUp() } func textFieldDidEndEditing(_ textField: UITextField) { moveViewDown() } func textFieldShouldReturn(_ textField: UITextField) -> Bool { view.endEditing(true) moveViewDown() return true } } extension ViewController: CLLocationManagerDelegate { func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { CLGeocoder().reverseGeocodeLocation(locations.last!, 81 completionHandler: {(placemarks:[CLPlacemark]?, error:NSError?) -> Void in if let placemarks = placemarks { let placemark = placemarks[0] self.locationTuples[0].mapItem = MKMapItem(placemark: MKPlacemark(coordinate: placemark.location!.coordinate, addressDictionary: placemark.addressDictionary as! [String:AnyObject]?)) self.sourceField.text = self.formatAddressFromPlacemark(placemark) self.enterButtonArray.filter{$0.tag == 1}.first!.isSelected = true }} as! CLGeocodeCompletionHandler) } func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { print(error) } } ... 59 DANH MỤC BẢNG LỜI CAM ĐOAN LỜI CẢM ƠN MỞ ĐẦU CHƯƠNG 1: TỔNG QUAN HỆ ĐIỀU HÀNH IOS VÀ NGÔN NGỮ LẬP TRÌNH SWIFT 1.1 Tổng quan IOS ... Toản MỤC LỤC LỜI CAM ĐOAN LỜI CẢM ƠN MỞ ĐẦU CHƯƠNG 1: TỔNG QUAN HỆ ĐIỀU HÀNH IOS VÀ NGÔN NGỮ LẬP TRÌNH SWIFT 1.1 Tổng quan IOS 1.1.1... 21 1.3.7 Classes and Structure (Lớp cấu trúc) 22 1.3.8 Subscript 23 1.3.9 Inheritance(Kế Thừa) 24 1.3.10 Subclass(lớp con) 24 1.3.11 Mothod and Property (phương

Ngày đăng: 25/07/2017, 13:54

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan