I have checked this code until I am 'blue in the face', but I can't see why I get an error saying missing closing bracket.
//
// ExploreDataManager.swift
// LetsEat3
//
// Created by Tony Hudson on 16/04/2021.
//
import Foundation
class ExploreDataManager {
func fetch() {
for data in loadData() {
print(data)
}
}
fileprivate func loadData() - [[String: AnyObject]] {
guard let path = Bundle.main.path(forResource: "ExploreData", ofType: "plist"), let items = NSArray(contentsOfFile: path) else {
return [[:]]
}
return items as![[String: AnyObject]]
}
}
If I add an additional bracket it then reports an additional 'Expected '}' in class?
I have counted 5 opening brackets and 5 closing brackets. I even checked to see whether I had mistakenly typed the wrong type of bracket elsewhere in the code!
Is this a bug?
If not what is the reason. for this error?
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
I am learning Xcode from Ahmad Sahar's book and somehow I have disconnected the exploreViewController from the navigation controller. I have now progressed far beyond the point where this was connected to the navigation controller, so I Ctrl + Dragged from the button to the navigation controller.
However when I ran the project I get a Compile error:
Couldn't compile connection: IBCocoaTouchOutletConnection: 0x123ef3a50 (sN1-9E-uLq) source=IBProxyObject: 0x123ef2be0 (Wnw-oV-gaS) 'Placeholder for UIStoryboardPopoverPresentationSegueTemplate with OID GlU-yO-pRa' property=anchorView destination=IBUIButton: 0x120195400 (WOO-Ms-Zlt) 'Button'
As I am still learning I am not sure how to fix this problem?
If I click on the segue icon it says 'Present as Popover segue'
and Segue Actions shows 'instantiation' with a circle but if I click on the circle nothing is listed for the segue.
Please help?
I am trying to learn Xcode using iOS 14 Programming for Beginners (Packt Pub).
I am now working on the part that adds the pins to the MapView, but when I run the app the map button is unresponsive (Runtime error).
I get the following message in the Debug area:
__2021-07-25 16:08:23.919240+0100 EatOut[1420:21167] Metal API Validation Enabled
Could not cast value of type 'Swift.Array<EatOut.RestaurantItem>' (0x1c31e3588) to '__C.MKAnnotation' (0x1c31e3888).
2021-07-25 16:08:24.003987+0100 EatOut[1420:21167] Could not cast value of type 'Swift.Array<EatOut.RestaurantItem>' (0x1c31e3588) to '__C.MKAnnotation' (0x1c31e3888).
Could not cast value of type 'Swift.Array<EatOut.RestaurantItem>' (0x1c31e3588) to 'C.MKAnnotation' (0x1c31e3888).
CoreSimulator 757.5 - Device: iPhone SE (2nd generation) (E06FF756-9D0E-45B8-BBF5-7B393524B880) - Runtime: iOS 14.5 (18E182) - DeviceType: iPhone SE (2nd generation)
I'm sure that this message means a lot to you experts, but as a beginner I haven't a clue!
The runtime error is in this func, in the final line:
func addMap(_ annontations: [RestaurantItem]) {
mapView.setRegion(manager.currentRegion(latDelta: 0.5, longDelta: 0.5), animated: true)
mapView.addAnnotation(manager.annotations as! MKAnnotation)
I get a build error on the final line if I do not apply the fix, which adds the as! MKAnnotation.
Is the error in the .plist or does the code need altering?
Please can you help?
Here is the full code for the swift file:
// MapViewController.swift
// EatOut
//
// Created by Tony Hudson on 15/07/2021.
//
import UIKit
import MapKit
class MapViewController: UIViewController, MKMapViewDelegate {
let manager = MapDataManager()
var selectedRestaurant: RestaurantItem?
@IBOutlet weak var mapView: MKMapView!
override func viewDidLoad() {
initialise()
func initialise() {
manager.fetch { (annotations) in addMap(annotations)
}
}
func addMap(_ annontations: [RestaurantItem]) {
mapView.setRegion(manager.currentRegion(latDelta: 0.5, longDelta: 0.5), animated: true)
mapView.addAnnotation(manager.annotations as! MKAnnotation)
}
}
}
I am trying to learn Xcode using iOS 14 Programming for Beginners (Packt Pub).
I have had several problems with the code so I have been ultra careful and I can't find any mistakes.
There is also another error in the code in an extension in the code.
Here is a copy of the code:
/
// MapViewController.swift
// EatOut
//
// Created by Tony Hudson on 15/07/2021.
// Links to: Item -308,318,319,320,321,324,341,352,353
import UIKit
import MapKit
class MapViewController: UIViewController,MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
let manager = MapDataManager()
var selectedRestaurant: RestaurantItem?
override func viewDidLoad() {
super.viewDidLoad()
initialize()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?){
switch segue.indentifier! { //<<Value of type 'UIStoryboardSegue' has no member 'indentifier'
case Segue.showDetail.rawValue: showRestaurantDetail(segue: segue)
default:
print("Segue not added")
}
}
}
// MARK: Private Extension
private extension MapViewController {
func initialize() {
mapView.delegate = self
manager.fetch {(annotations) in addMap(annotations)}
}
func addMap(_ annotations: [RestaurantItem]) {
mapView.setRegion(manager.currentRegion(latDelta: 0.5, longDelta: 0.5), animated: true)
mapView.addAnnotations(manager.annotations)
}
func showRestaurantDetail (segue: UIStoryboardSegue){
if let viewController = segue.destination as? RestaurantDetailViewController, let restaurant = selectedRestaurant {
viewController.selectedRestaurant = restaurant
}
}
}
// MARK: MKMapViewDelegate
extension MapViewController: MKMapViewDelegate { //<< Redundant conformance of 'MapViewController' to protocol 'MKMapViewDelegate'
func mapView(_ mapView: MKMapView, annotationView view:MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
guard let annotation = mapView.selectedAnnotations.first
else{
return
}
selectedRestaurant = annotation as? RestaurantItem
self.performSegue(withIdentifier: Segue.showDetail.rawValue, sender: self)
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation ) -> MKAnnotationView? {
let identifier = "custompin"
guard !annotation.isKind(of: MKUserLocation.self) else {
return nil
}
var annotationView: MKAnnotationView?
if let customAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) {
annotationView = customAnnotationView
annotationView?.annotation = annotation
} else {
let av = MKAnnotationView(annotation: annotation, reuseIdentifier: identifier)
av.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
annotationView = av
}
if let annotationView = annotationView {
annotationView.canShowCallout = true
annotationView.image = UIImage(named: "custom-annotation")
}
return annotationView
}
}
I am wondering if there is some action that I have not done previously that is causing these errors.
Can anyone help?
I am trying to learn Xcode using a book called 'iOS 14
Programming for Beginners'. Although the book is supposed to show the correct
code I have found that it still raises errors when I type in the code. They
also have the code online, which I have downloaded and compared to my code, yet
I still get errors.
Here is the file that produces the errors:
//
// ExploreViewController.swift
// EatOut
//
// Created by Tony Hudson on 15/07/2021
//
import UIKit
class ExploreViewController: UIViewController,
UICollectionViewDelegate {
@IBOutlet weak var collectionView:
UICollectionView!
let manager = ExploreDataManager()
var selectedCity: LocationItem?
var headerView: ExploreHeaderView!
override func viewDidLoad() {
super.viewDidLoad()
initialize()
}
override func prepare(for segue:
UIStoryboardSegue, sender: Any?) {
switch segue.identifier {
case
Segue.locationList.rawValue:
showLocationList(segue: segue)
case
Segue.restaurantList.rawValue: //ERROR
HERE
showRestaurantListing(segue: segue)
default:
print("Segue not added")
}
}
override func
shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool
{
if identifier ==
Segue.restaurantList.rawValue { //AND HERE
guard selectedCity!= nil else {
showAlert()
return false
}
return true
}
return true
}
}
// MARK: Private Extension
private extension ExploreViewController {
func initialize() {
manager.fetch()
}
func showLocationList(segue:
UIStoryboardSegue) {
guard let navController =
segue.destination as? UINavigationController, let viewController =
navController.topViewController as? LocationViewController else {
return
}
guard let city = selectedCity
else {
return
}
viewController.selectedCity = city
}
func showRestaurantListing(segue:
UIStoryboardSegue) {
if let viewController =
segue.destination as? RestaurantListViewController, let city = selectedCity,
let index = CollectionView.indexPathsForSelectedItems?.first {
viewController.selectedType = manager.explore(at: index).name
viewController.selectedCity = city
}
}
func showAlert() {
let alertController = UIAlertController(title:
"Location Needed", message: "Please select a location.",
preferredStyle: .alert)
let okAction =
UIAlertAction(title: "OK", style: .default, handler: nil)
alertController.addAction(okAction)
present(alertController,
animated: true, completion: nil)
}
@IBAction func unwindLocationCancel(segue:
UIStoryboardSegue){
}
@IBAction func
unwindLocationDone(segue:UIStoryboardSegue) {
if let viewController =
segue.source as? LocationViewController {
selectedCity =
viewController.selectedCity
if let location =
selectedCity {
headerView.lblLocation.text = location.full
}
}
}
}
// MARK: UICollectionViewDataSource
extension ExploreViewController: UICollectionViewDataSource
{
func collectionView(_ collectionView:
UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath:
IndexPath) -> UICollectionReusableView {
let header =
collectionView.dequeueReusableSupplementaryView(ofKind: kind,
withReuseIdentifier: "header", for: indexPath)
headerView = header as?
ExploreHeaderView
return headerView
}
func collectionView(_ collectionView:
UICollectionView, numberOfItemsInSection section: Int) -> Int {
manager.numberOfItems()
}
func collectionView(_ collectionView:
UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
let cell =
collectionView.dequeueReusableCell(withReuseIdentifier:
"exploreCell", for: indexPath) as! ExploreCell
let item = manager.explore(at:
indexPath)
cell.lblName.text = item.name
cell.imgExplore.image = UIImage(named:
item.image)
return cell
}
//
Can anyone see why this is producing this error?```