попытка выполнить переход приводит к завершению с необработанным исключением типа NSException

У меня есть UITableView VC, для которого ячейки связаны с функцией подготовки к переходу, и это работает. он перемещается в правильный VC. Я добавил rightBarButtonItem в элемент навигации, который я связал с методом, вызывающим PerformForSegue, и дал ему правильный идентификатор. Все работает нормально, пока я не нажму правую боковую кнопку. Когда я это делаю, я получаю: «Стек вызовов первого броска. Завершение с необработанным исключением типа NSException». Может ли кто-нибудь помочь мне и указать мне правильное направление, пожалуйста? Код и распечатайте список ниже. Спасибо.

class AssignNumberOfRoomsForFloorsVC: UITableViewController {

//MARK: - Properties

private var managedObjectContext: NSManagedObjectContext!

private var storedFloors = [Floors]()


//MARK: - Actions

override func viewDidLoad() {
    super.viewDidLoad()
    managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    loadFloorData()
    self.tableView.reloadData()
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: Selector(("navigateToNextViewController")))

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

private func loadFloorData() {
    let request: NSFetchRequest<Floors> = Floors.fetchRequest()
    request.returnsObjectsAsFaults = false
    do {
        storedFloors = try managedObjectContext.fetch(request)
    }
    catch {
        print("could not load data from core \(error.localizedDescription)")
    }
}

private func navigateToNextViewController(){
    self.performSegue(withIdentifier: "room and alarm type", sender: self)
}



// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return storedFloors.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "floor cell", for: indexPath) as! FloorCell
    let floorItem = storedFloors[indexPath.row]
    cell.floorNumberTxt.text = String(floorItem.floorNumber)
    return cell
}

// MARK: - Navigation

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    var selectedRow = self.tableView.indexPathForSelectedRow
    let floorItem = storedFloors[(selectedRow?.row)!]
    let destinationController = segue.destination
    if let assignRoomsVC = destinationController as? DeclareRoomsVC {
        if let identifier = segue.identifier {
            switch identifier {
            case "assign number of rooms":
                let _ = assignRoomsVC.view
                assignRoomsVC.floorNumberTxt.text = String(floorItem.floorNumber)
                assignRoomsVC.selectedFloor = floorItem.floorNumber
            default: break
            }
        }
    }
}

}

Это сообщение в консоли:

2017-03-26 21:50:28.041 PDCiPad[10433:292572] -[PDCiPad.AssignNumberOfRoomsForFloorsVC navigateToNextViewController]: unrecognized selector sent to instance 0x7ff5b7c326c0

новая проблема

Когда вы нажимаете на

class AssignNumberOfRoomsForFloorsVC: UITableViewController {

//MARK: - Properties

private var managedObjectContext: NSManagedObjectContext!

private var storedFloors = [Floors]()


//MARK: - Actions

override func viewDidLoad() {
    super.viewDidLoad()
    managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    loadFloorData()
    self.tableView.reloadData()
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: Selector(("navigateToNextViewController")))

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

private func loadFloorData() {
    let request: NSFetchRequest<Floors> = Floors.fetchRequest()
    request.returnsObjectsAsFaults = false
    do {
        storedFloors = try managedObjectContext.fetch(request)
    }
    catch {
        print("could not load data from core \(error.localizedDescription)")
    }
}

private func navigateToNextViewController(){
    self.performSegue(withIdentifier: "room and alarm type", sender: self)
}



// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return storedFloors.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "floor cell", for: indexPath) as! FloorCell
    let floorItem = storedFloors[indexPath.row]
    cell.floorNumberTxt.text = String(floorItem.floorNumber)
    return cell
}

// MARK: - Navigation

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    var selectedRow = self.tableView.indexPathForSelectedRow
    let floorItem = storedFloors[(selectedRow?.row)!]
    let destinationController = segue.destination
    if let assignRoomsVC = destinationController as? DeclareRoomsVC {
        if let identifier = segue.identifier {
            switch identifier {
            case "assign number of rooms":
                let _ = assignRoomsVC.view
                assignRoomsVC.floorNumberTxt.text = String(floorItem.floorNumber)
                assignRoomsVC.selectedFloor = floorItem.floorNumber
            default: break
            }
        }
    }
}
,
2017-03-26 21:50:28.041 PDCiPad[10433:292572] -[PDCiPad.AssignNumberOfRoomsForFloorsVC navigateToNextViewController]: unrecognized selector sent to instance 0x7ff5b7c326c0
становится _3_, потому что вы используете _4_ и не выбрали ни одной строки.


person mihai mimi    schedule 26.03.2017    source источник


Ответы (2)


override func prepare(for segue: UIStoryboardSegue, sender: Any?) вызывается, если вы нажимаете на свою UIBarButtonItem или ячейку tableView.

Так что это работает, когда вы нажимаете на ячейку tableView, потому что self.tableView.indexPathForSelectedRow вернет индекс выбранной ячейки. Но вернет nil для вашего UIBarButtonItem.

Наконец, если вы используете ! для нулевого значения, происходит сбой.

Используйте синтаксис Swift 3 UIBarButtonItem

person Arthur    schedule 27.03.2017

спасибо, что нашли время. Я сделал то, что вы сказали, и это переместило ошибку в мой файл prepareForSegue. Не могли бы вы взглянуть и указать мне в правильном направлении?

#selector(navigateToNextViewController)
person vadian    schedule 26.03.2017
comment
Это другое исключение. Какое исключение? _1_ скорее всего _2_. Любой небрежно написанный восклицательный знак — это приглашение к аварии. - person mihai mimi; 27.03.2017
comment
2017-03-26 21:50:28.219 PDCiPad[10433:292572] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «-[PDCiPad.AssignNumberOfRoomsForFloorsVC navigationToNextViewController]: нераспознанный селектор отправлен экземпляру 0x7ff5b'7c326c00 / STRIC> Стекский стек вызова первого броска: (0 corefoundation 0x000000010db79d4b Exceptionpreprocess + 171 1 libobjc.a.dylib 0x000000010d1ba21e objc_exception_throw + 48 2 corefoundation 0x000000010dbeeb9f04 - [nsobject (nsobject) dotnrecognizeLiselector:] + 132 3 Corefoundation 0x000000010daff005 ___ Переадресация _ + 1013 4 CoreFoundation 0x000000010dafeb88 _CF_forwarding_prep_0 + 120 5 UIKit 0x000000010e6b28bc -[UIApplication sendAction:to:from:forEvent:] + 83 6 UIKit 0x000000010eaf44a1 -[UIBarButtonItem(UIBarButtonItem(UIBarButtonItem)( Daction: Conevent:] + 149 7 Uikit 0x000000010E6B28BC - [УДИЧЕСКАЯ СТАНДАЦИЯ: TO: От: Free:] + 83 8 Uikit 0x000000010E838C38 - [UICONTROL DENDACTION: to: Freevent:] + 67 9 Uikit 0x000000010e838F51 - + 444 10 UIKit 0x000000010e8390db - [UIControl _sendActionsForEvents: withEvent:] + 838 11 UIKit 0x000000010e837e4d - [UIControl touchesEnded: withEvent:] + 668 12 UIKit 0x000000010e720545 - [UIWindow _sendTouchesForEvent:] + 2747 13 UIKit 0x000000010e721c33 - [UIWindow SendEvent:] + 4011 14 UIKit 0x000000010e6ce9ab -[UIApplication sendEvent:] + 371 15 UIKit 0x000000010eebb72d dispatchPreprocessedEventFromEventQueue + 3248 16 UIKit 0x000000010eeb4463 __handleEventQueue + 4879 17 CoreFoundation 0x000000010db1e761 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17 18 CoreFoundation 0x000000010db0398c __CFRunLoopDoSources0 + 556 19 CoreFoundation 0x000000010db02e76 __CFRunLoopRun + 918 20 CoreFoundation 0x000000010db02884 CFRunLoopRunSpecific + 420 21 GraphicsServices 0x0000000113908a6f GSEventRunModal + 161 22 UIKit 0x000000010e6b0c68 UIApplicationMain + 159 23 PDCiPad 0x000000010cad8c1f основной + 111 24 libdyld.dylib 0x0000000111a3268d start + 1 ) libc++abi.dylib: завершение с необработанным исключением типа NSException - person vadian; 27.03.2017