ios - 应用程序给出 SIGBART 并声称打开特定 View 时数组索引不存在,然后崩溃

标签 ios arrays swift

大家

第一次在这里发帖,但是什么都没有。我目前正在为我正在为学校开发的应用程序做出贡献。我最近添加的功能是该应用程序的计划功能。昨天,该应用程序能够创建、移动、存储和删除作业。今天,我的目标是添加编辑作业的功能。当我第一次尝试运行新代码时,它除了说我试图访问的数组中的索引不存在之外,还返回了 SIGBART 错误,尽管我几乎肯定它确实存在。这是完整的代码:

https://github.com/nicholaszana/SSA-Mobile-App-PlannerTab

但我很确定错误出在这个 ViewController 中:

//
//  NewAssignmentViewController.swift
//  PlannerTab
//
//  Created by Nicholas Zana on 9/21/17.
//  Copyright © 2017 Nicholas Zana. All rights reserved.
//

import UIKit

class NewAssignmentViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate, UITextViewDelegate {


    @IBOutlet weak var assignmentTextField: UITextField!
    @IBOutlet weak var notesTextView: UITextView!

    @IBOutlet weak var classPicker: UIPickerView!
    @IBOutlet weak var dueDatePicker: UIDatePicker!
    var array:Array = [C1Name, C2Name, C3Name, C4Name, C5Name, C6Name]
    var selectedClassName = C1Name
    var dueDate:Date = Date()
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.assignmentTextField.delegate = self
        notesTextView.delegate = self

        var namesArray:Array = UserDefaults.standard.array(forKey: "AssignmentNamesArray")!
        var dueDateArray:Array = UserDefaults.standard.array(forKey: "AssignmentDueDateArray")!
        var classArray:Array = UserDefaults.standard.array(forKey: "AssignmentClassArray")!
        var notesArray:Array = UserDefaults.standard.array(forKey: "AssignmentNotesArray")!
        notesTextView.text = notesArray[clickedCell] as! String
        assignmentTextField.text = namesArray[clickedCell] as! String
        dueDatePicker.date = dueDateArray[clickedCell] as! Date
        classPicker.selectRow(1, inComponent: 1, animated: false)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //clickedCell defined in other view controller
    @IBAction func didPressFinish(_ sender: Any) {
        var namesArray:Array = UserDefaults.standard.array(forKey: "AssignmentNamesArray")!
        namesArray[clickedCell - 1] = "\(assignmentTextField.text!)"
        UserDefaults.standard.set(namesArray, forKey: "AssignmentNamesArray")
        var dueDateArray:Array = UserDefaults.standard.array(forKey: "AssignmentDueDateArray")!
        dueDateArray[clickedCell - 1] = dueDate
        UserDefaults.standard.set(dueDateArray, forKey: "AssignmentDueDateArray")
        var classArray:Array = UserDefaults.standard.array(forKey: "AssignmentClassArray")!
        classArray[clickedCell - 1] = selectedClassName
        UserDefaults.standard.set(classArray, forKey: "AssignmentClassArray")
        var notesArray:Array = UserDefaults.standard.array(forKey: "AssignmentNotesArray")!
        notesArray[clickedCell - 1] = notesTextView.text!
        UserDefaults.standard.set(notesArray, forKey: "AssignmentNotesArray")
        UserDefaults.standard.synchronize()
    }
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return 6
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return array[row]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        selectedClassName = array[row]
    }


    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return false
    }

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if(text == "\n") {
            textView.resignFirstResponder()
            return false
        }
        return true
    }

    @IBAction func dueDateValueChanged(_ sender: Any) {
        dueDatePicker.datePickerMode = UIDatePickerMode.date
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .long
        let selectedDate = dueDatePicker.date
        dueDate = selectedDate
    }



}

是什么导致了这些错误?它们是不同的问题,还是同一个问题?

谢谢

/恩扎纳

编辑:这是 ViewController.swift:

//
//  ViewController.swift
//  PlannerTab
//
//  Created by Nicholas Zana on 9/21/17.
//  Copyright © 2017 Nicholas Zana. All rights reserved.
//

import UIKit

let C1Name = "History"

let C2Name = "Chemistry"

let C3Name = "Chinese 2A"

let C4Name = "Math II"

let C5Name = "Computer"

let C6Name = "Free"

var clickedCell:Int = 0

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate {

    @IBOutlet weak var editButton: UIButton!
    //Outlet for Table View
    @IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        //Checks if App has ever been run before.
        if (UserDefaults.standard.bool(forKey: "HasLaunchedOnce")) {
            // This code will be run only if the app has been run before.
        } else {
            //This code is only run on the very first app launch.
            //UserDefaults are just permanately stored (even after app closed) variables. Google Them. They're really cool and easy to use.

            //Stores "UserDefaults" to say that the App has launched before.
            UserDefaults.standard.set(true, forKey: "HasLaunchedOnce")
            //Updates UserDefaults
            UserDefaults.standard.synchronize()
            //Creates an Array in "UserDefaults" to store names of each task
            UserDefaults.standard.set(["This is your digital planner!", "Add assignments with +", "Swipe left to complete"],  forKey: "AssignmentNamesArray")
            //Creates an Array in "UserDefaults" to store the due date of each task
            UserDefaults.standard.set([Date(), Date(), Date()], forKey: "AssignmentDueDateArray")
            //Creates an Array in "UserDefaults" to store the due Period of each task
            UserDefaults.standard.set(["These are Notes. You can add additional information about an assignemnt here.","Notes","Notes"], forKey: "AssignmentNotesArray")
            //Creates an Array in "UserDefaults" to store the class of each task
            UserDefaults.standard.set([C1Name, C2Name, C3Name], forKey: "AssignmentClassArray")
        }
    }


        @IBAction func didPressPlus(_ sender: Any) {
            var namesArray = UserDefaults.standard.array(forKey: "AssignmentNamesArray")!
            namesArray.append("Assignment Name")
            UserDefaults.standard.set(namesArray, forKey: "AssignmentNamesArray")
            var dueDateArray = UserDefaults.standard.array(forKey: "AssignmentDueDateArray")!
            dueDateArray.append(Date())
            UserDefaults.standard.set(dueDateArray, forKey: "AssignmentDueDateArray")
            print(UserDefaults.standard.array(forKey: "AssignmentDueDateArray")!)
            var classArray = UserDefaults.standard.array(forKey: "AssignmentClassArray")!
            classArray.append(C1Name)
            UserDefaults.standard.set(classArray, forKey: "AssignmentClassArray")
            var notesArray = UserDefaults.standard.array(forKey: "AssignmentNotesArray")!
            notesArray.append("Notes")
            clickedCell = namesArray.count
        }

    //Tells how many cells need to be in the table view
    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return UserDefaults.standard.array(forKey: "AssignmentNamesArray")!.count
    }
    //Adds ability to delete cells
   func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == UITableViewCellEditingStyle.delete {
            var namesArray = UserDefaults.standard.array(forKey: "AssignmentNamesArray")!
            namesArray.remove(at: indexPath.row)
            UserDefaults.standard.set(namesArray, forKey: "AssignmentNamesArray")
            var dueDateArray = UserDefaults.standard.array(forKey: "AssignmentDueDateArray")!
            dueDateArray.remove(at: indexPath.row)
            UserDefaults.standard.set(dueDateArray, forKey: "AssignmentDueDateArray")
            print(UserDefaults.standard.array(forKey: "AssignmentDueDateArray")!)
            var classArray = UserDefaults.standard.array(forKey: "AssignmentClassArray")!
            classArray.remove(at: indexPath.row)
            UserDefaults.standard.set(classArray, forKey: "AssignmentClassArray")
            var notesArray = UserDefaults.standard.array(forKey: "AssignmentNotesArray")!
            notesArray.remove(at: indexPath.row)
            UserDefaults.standard.set(namesArray, forKey: "AssignmentNotesArray")
            tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
            }
    }

    //Creates Cells
    @available(iOS 2.0, *)
    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            //Creates a cell as defined by prototype cell
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! AssignmentTableViewCellViewController
            //sets cell
        //Names
        let namesArray:Array = UserDefaults.standard.array(forKey: "AssignmentNamesArray")!
        cell.assignmentNameLabel.text = namesArray[indexPath.row] as? String
        //Due Date
        func inputDateWeekdayAsString(Date:Date) -> String {
            let inputDate = Date

            let inputWeekday:Int = Calendar.current.component(.weekday, from: inputDate)

            let weekdayArray:Array = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
            if inputWeekday == nil {
                return "Error!"
            } else {
                return weekdayArray[inputWeekday - 1]
            }
        }
        let dueDateArray:Array = UserDefaults.standard.array(forKey: "AssignmentDueDateArray")!
        DateFormatter().dateStyle = .long
        DateFormatter().locale = Locale.init(identifier: "en_GB")
        let inputDate:Date = dueDateArray[indexPath.row] as! Date
        let inputDateForDisplay = DateFormatter().string(from: inputDate)
        let inputWeekdayAsStringVar = inputDateWeekdayAsString(Date: inputDate)
        let inputYear = Calendar.current.component(.year, from: inputDate)
        let inputMonth = Calendar.current.component(.month, from: inputDate)
        let inputDay = Calendar.current.component(.day, from: inputDate)
        let todayYear = Calendar.current.component(.year, from: Date())
        let todayMonth = Calendar.current.component(.month, from: Date())
        let todayDay = Calendar.current.component(.day, from: Date())
        var dueDateOutputString = "\(dueDateArray[indexPath.row])"

        if inputYear != todayYear {
            dueDateOutputString = "\(inputWeekdayAsStringVar), \(inputDateForDisplay)"
        } else if inputMonth != todayMonth {
            dueDateOutputString = "\(inputWeekdayAsStringVar), \(inputDateForDisplay)"
        } else if (inputDay - todayDay < 7) && (inputDay - todayDay > 0) {
            if inputDay - todayDay == 1 {
                dueDateOutputString = "Tommorow"
            } else {
            dueDateOutputString = "Next \(inputWeekdayAsStringVar)"
            }
        } else if (inputDay - todayDay > -7) && (inputDay - todayDay < 0) {
            if inputDay - todayDay == 1 {
                dueDateOutputString = "Yesterday"
            } else {
                dueDateOutputString = "Last \(inputWeekdayAsStringVar)"
            }
        } else if inputDay == todayDay {
            dueDateOutputString = "Today"
        } else {
           dueDateOutputString = "\(inputWeekdayAsStringVar), \(inputDateForDisplay)"
            print(inputDateForDisplay)
        }


        cell.assignmentDueDateLabel.text = dueDateOutputString
       //Class
        let assignmentClassArray:Array = UserDefaults.standard.array(forKey: "AssignmentClassArray")!
        cell.assignmentClassLabel.text = assignmentClassArray[indexPath.row] as? String

        return (cell)
            }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
    {
        return 75;//Sets height of each Assignment Cell
    }

    //Allows dragging around cell order

    func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    //Tells app how to reorder arrays when table view is changed
    func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        //Names
        var namesArray:Array = UserDefaults.standard.array(forKey: "AssignmentNamesArray")!
        let namesItem = namesArray[sourceIndexPath.row]
        namesArray.remove(at: sourceIndexPath.row)
        namesArray.insert(namesItem, at: destinationIndexPath.row)
        UserDefaults.standard.set(namesArray, forKey: "AssignmentNamesArray")
        //DueDates
        var dueDateArray:Array = UserDefaults.standard.array(forKey: "AssignmentDueDateArray")!
        let dueDateItem = dueDateArray[sourceIndexPath.row]
        dueDateArray.remove(at: sourceIndexPath.row)
        dueDateArray.insert(dueDateItem, at: destinationIndexPath.row)
        UserDefaults.standard.set(dueDateArray, forKey: "AssignmentDueDateArray")
        //Class
        var classArray:Array = UserDefaults.standard.array(forKey: "AssignmentClassArray")!
        let classItem = classArray[sourceIndexPath.row]
        classArray.remove(at: sourceIndexPath.row)
        classArray.insert(classItem, at: destinationIndexPath.row)
        UserDefaults.standard.set(classArray, forKey: "AssignmentClassArray")
        //Notes
        var notesArray:Array = UserDefaults.standard.array(forKey: "AssignmentNotesArray")!
        let notesItem = namesArray[sourceIndexPath.row]
        notesArray.remove(at: sourceIndexPath.row)
        notesArray.insert(notesItem, at: destinationIndexPath.row)
        UserDefaults.standard.set(notesArray, forKey: "AssignmentNotesArray")
        //Synchronizes UserDefaults
        UserDefaults.standard.synchronize()
    }
    @IBAction func didPressEditButton(_ sender: Any) {
            //Enables dragging around items
             tableView.isEditing = !tableView.isEditing

        if tableView.isEditing == true {
            editButton.setTitle("Done", for: .normal)
        } else {
            editButton.setTitle("Edit", for: .normal)
        }

    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        clickedCell = indexPath.row
    }

    }

根据“rt”的请求,这是在控制台中输入“bt”的结果。不过我不太确定这意味着什么。

* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
    frame #0: 0x000000010fd67d42 libsystem_kernel.dylib`__pthread_kill + 10
    frame #1: 0x000000010fd9f457 libsystem_pthread.dylib`pthread_kill + 90
    frame #2: 0x000000010fa28107 libsystem_c.dylib`abort + 127
    frame #3: 0x000000010f7ba91f libc++abi.dylib`abort_message + 245
    frame #4: 0x000000010f7baabb libc++abi.dylib`default_terminate_handler() + 265
    frame #5: 0x000000010ae6c1be libobjc.A.dylib`_objc_terminate() + 97
    frame #6: 0x000000010f7d6159 libc++abi.dylib`std::__terminate(void (*)()) + 8
    frame #7: 0x000000010f7d5e0a libc++abi.dylib`__cxa_rethrow + 99
    frame #8: 0x000000010ae6c0dc libobjc.A.dylib`objc_exception_rethrow + 40
    frame #9: 0x000000010b48fb09 CoreFoundation`CFRunLoopRunSpecific + 537
    frame #10: 0x0000000110f829c6 GraphicsServices`GSEventRunModal + 62
    frame #11: 0x000000010b983d30 UIKit`UIApplicationMain + 159
  * frame #12: 0x000000010a53f7f7 PlannerTab`main at AppDelegate.swift:12
    frame #13: 0x000000010f955d81 libdyld.dylib`start + 1

最佳答案

删除/评论此行修复了您的崩溃

classPicker.selectRow(1, inComponent: 1, 动画: false)

基本上您只有 1 个组件,因此适合您的正确行是

classPicker.selectRow(1, inComponent: 0, 动画: false)

关于ios - 应用程序给出 SIGBART 并声称打开特定 View 时数组索引不存在,然后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46411094/

相关文章:

ios - UITapGesture 不适用于堆栈 View 中的 xib 文件

java - 是什么导致了 java.lang.ArrayIndexOutOfBoundsException 以及如何防止它?

php - IN array in where 子句 mysql php pdo

swift - 覆盖 tvOS 上的 pressBegan 和菜单按钮

ios - UserDefault 保存按钮状态

iphone - 如何在 iOS 上正确使用 Facebook Graph API

ios - 蒙面的 UIVisualEffectView 在 iOS 10 上不起作用

ios - App Store 崩溃报告 EXC_BREAKPOINT (SIGTRAP)

ios - 1 个 iOS 分发证书,用于 3 个不同的应用程序

javascript - JS循环遍历对象