Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

This class is not key value coding-compliant for the key cancel

Tags:

I keep getting this error: Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<FoodTracker.MealViewController 0x7faa9ed189d0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key cancel.'

I'm trying to complete the Apple developer guide to getting started with iOS apps. My code and storyboard looks exactly like theirs does in the example file. I'm hoping that a fresh eye might be able to see something I am not?

import UIKit import os.log  class MealViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {      //MARK: Properties     @IBOutlet weak var nameTextField: UITextField!     @IBOutlet weak var photoImageView: UIImageView!     @IBOutlet weak var ratingControl: RatingControl!     @IBOutlet weak var saveButton: UIBarButtonItem!     /*      This value is either passed by 'MealTableViewController' in      'prepare(for:sender) or constructed as part of adding a new meal.     */     var meal: Meal?      override func viewDidLoad() {         super.viewDidLoad()          // Handle the text field's user input through delegate callbacks         nameTextField.delegate = self          // Enable save button only if text field has valid Meal name         updateSaveButtonState()     }      //MARK: UITextFieldDelegate     func textFieldShouldReturn(_ textField: UITextField) -> Bool {         // Hide the keyboard         textField.resignFirstResponder()         return true     }     func textFieldDidEndEditing(_ textField: UITextField) {         updateSaveButtonState()         navigationItem.title = textField.text     }     func textFieldDidBeginEditing(_ textField: UITextField) {         // Disable save button while editing         saveButton.isEnabled = false     }      //MARK: UIImagePickerControllerDelegate     func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {         // Dismiss the picker if the user canceled         dismiss(animated: true, completion: nil)     }     func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {         // The info dictionary may contain multiple representations of the image. You want to use the original.         guard let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage else {             fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")         }         // Set photoImageView to display the selected image         photoImageView.image = selectedImage         // Dismiss the picker         dismiss(animated: true, completion: nil)     }      //MARK: Navigation     @IBAction func cancel(_ sender: UIBarButtonItem) {         dismiss(animated: true, completion: nil)     }       // Configure view controller before it's presented     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {         super.prepare(for: segue, sender: sender)          // Configure destination view controller only when save button pressed         guard let button = sender as? UIBarButtonItem, button === saveButton else {             os_log("The save button was not pressed, cancelling", log: OSLog.default, type: .debug)             return         }          let name = nameTextField.text ?? ""         let photo = photoImageView.image         let rating = ratingControl.rating          // Set meal to be passed to MealTableViewController after unwind segue         meal = Meal(name: name, photo: photo, rating: rating)     }      //MARK: Actions     @IBAction func selectImageFromPhotoLibrary(_ sender: UITapGestureRecognizer) {         // Hide the keyboard         nameTextField.resignFirstResponder()         // UIImagePickerController is a view controller that lets a user pick media from their photo library         let imagePickerController = UIImagePickerController()         // Only allow photos to be picked, not taken         imagePickerController.sourceType = .photoLibrary         // Make sure ViewController is notified when the user picks an image         imagePickerController.delegate = self         present(imagePickerController, animated: true, completion: nil)     }      //MARK: Private Methods     private func updateSaveButtonState() {         // Disable the save button if the text field is empty         let text = nameTextField.text ?? ""         saveButton.isEnabled = !text.isEmpty     } } 

There are a few other files, but please just let me know what you need because I am very new to Swift/XCode and not sure what to provide/not provide.

like image 728
Ethan Avatar asked Aug 27 '17 07:08

Ethan


People also ask

What is key value coding?

About Key-Value Coding. Key-value coding is a mechanism enabled by the NSKeyValueCoding informal protocol that objects adopt to provide indirect access to their properties. When an object is key-value coding compliant, its properties are addressable via string parameters through a concise, uniform messaging interface.

What is @IBOutlet?

In the case of @IBOutlet , this is a connection from an Interface Builder user interface component – e.g. a UIButton – to a property in a view controller or other piece of Swift code.


1 Answers

This means that you have something on your storyboard connected to the IBOutlet called cancel but you don't have this IBOutlet in your class. So compiler can't find Key cancel(it means property) in your class. You should find that button(i think it's a UIButton because of the name) in storyboard, click right mouse button on it and click "x" to delete that connection. Or you might want to delete this button at all. Or you might want to add this IBOutlet to your class.

like image 192
Alex Shubin Avatar answered Oct 05 '22 10:10

Alex Shubin