Ошибка в контроллере табличного представления При использовании следующей фатальной ошибки: индекс выходит за пределы диапазона - PullRequest
0 голосов
/ 17 февраля 2019

Я столкнулся с проблемой и не могу ее решить

TableViewController:

var items: [String?] = ["door","table","chair"]
var givenDescription: [String?] = ["Change the description using 

class TableViewController: UITableViewController, UIToolbarDelegate {
the edit option"]
@IBOutlet var myTableView: UITableView!



override func viewDidAppear(_ animated: Bool) {
    myTableView.reloadData()
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 100
}

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return items.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
    cell.textLabel?.text = items[indexPath.row]
    cell.detailTextLabel?.text = givenDescription[indexPath.row]

    return cell
}

ViewController:

import UIKit
import MobileCoreServices

class AddViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

var newPic: Bool?

//Outlets
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var addName: UITextField!
@IBOutlet weak var addDescription: UITextField!
@IBAction func addImage(_ sender: Any) {
    let myAlert = UIAlertController(title: "Select Image From", message: "", preferredStyle: .actionSheet)
    let cameraAction = UIAlertAction(title: "Camera", style: .default, handler: nil)
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerControllerSourceType.camera
        imagePicker.mediaTypes = [kUTTypeImage as String]
        imagePicker.allowsEditing = false
        self.present(imagePicker, animated: true, completion: nil)
        self.newPic = true
    }
    let cameraRoll = UIAlertAction(title: "Camera Roll", style: .default, handler: nil)
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
        imagePicker.mediaTypes = [kUTTypeImage as String]
        imagePicker.allowsEditing = false
        self.present(imagePicker, animated: true, completion: nil)
        self.newPic = false
    }
    myAlert.addAction(cameraAction)
    myAlert.addAction(cameraRoll)
    self.present(myAlert, animated: true)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let mediaType = info[UIImagePickerControllerMediaType] as! NSString
    if mediaType.isEqual(to: kUTTypeImage as String) {
        let image = info[UIImagePickerControllerOriginalImage] as! UIImage
        imageView.image = image

        if newPic == true {
            UIImageWriteToSavedPhotosAlbum(image, self, #selector(imageError), nil)
        }
    }
    self.dismiss(animated: true, completion: nil)
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    self.dismiss(animated: true, completion: nil)
}

@objc func imageError(image: UIImage, didFinishSavingWithError error: NSErrorPointer, contextInfo:UnsafeRawPointer) {
    if error != nil {
        let alert = UIAlertController(title: "Save Failed", message: "Failed to save image", preferredStyle: .alert)
        let cancelAction = UIAlertAction(title: "Okay", style: .cancel, handler: nil)
        alert.addAction(cancelAction)
        self.present(alert, animated: true, completion: nil)
    }
}

//Action
@IBAction func create(_ sender: Any) {
    if (addName.text != "") {
        items.append(addName.text!)
        addName.text = ""
    }
    if (addDescription.text != "") {
        givenDescription.append(addDescription.text!)
        addDescription.text = ""
    }
    self.navigationController?.popViewController(animated: true)
}   
}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Это был простой ответ.

@IBAction func create(_ sender: Any) {
if (addName.text != "" && addDescription.text != "") {
    items.append(addName.text!)
    addName.text = ""
    givenDescription.append(addDescription.text!)
    addDescription.text = ""
}
self.navigationController?.popViewController(animated: true)

}

0 голосов
/ 17 февраля 2019

Вы можете «исправить» функцию create несколькими способами, например, следующим образом:

@IBAction func create(_ sender: Any) {
    if (addName.text != "" && addDescription.text != "") {
        items.append(addName.text!)
        addName.text = ""
        givenDescription.append(addDescription.text!)
        addDescription.text = ""
    }
    self.navigationController?.popViewController(animated: true)
}

, но гораздо более удачным вариантом является создание простой структуры

struct Item {
    var name: String
    var itemDescription: String
}
* 1007.* и используйте его вместо
@IBAction func create(_ sender: Any) {
    if (addName.text != "" && addDescription.text != "") { //or just check one depending on if one is more important
        let item = Item(name: addName.text!, itemDescription: addDescription.text!)
        items.append(item)
    }
    self.navigationController?.popViewController(animated: true)
}

, а массив items определен как

var items: [Item]()

andd для вашего табличного представления

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")

    let item = items[indexPath.row]
    cell.textLabel?.text = item.name
    cell.detailTextLabel?.text = item.itemDescription

    return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...