ios - Segue 以查看 Controller 崩溃

标签 ios swift uitableview

谁能告诉我我在这里做错了什么?我有一个正在设计的小应用程序,它正在从我的核心数据中添加、编辑和删除用户。但是,当我选择一行时我的应用程序崩溃了,这应该将我带到下一个 viewController。 错误是:“ fatal error :在展开可选值时意外发现 nil” 在此转换中准备 segue 函数失败:let contact:Contact = fetchedResultController.objectAtIndexPath(indexPath!) as!联系方式

所以当我点击一行时,它必须转到下一个 View Controller 。

这是我的代码:

//类 ContactsTableViewController

import UIKit
import CoreData

class ContactsTableViewController: UITableViewController, NSFetchedResultsControllerDelegate{

    // MARK: - Properties
    let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
    var fetchedResultController: NSFetchedResultsController = NSFetchedResultsController()


    // MARK: - Actions
    @IBAction func toggleMe(sender: AnyObject) {
        UberSideBar.toggleWindow()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        fetchedResultController = getFtechedResultController()
        fetchedResultController.delegate = self
        fetchedResultController.performFetch(nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        let numberOfSection = fetchedResultController.sections?.count
        return numberOfSection!
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let numberOfinASection = fetchedResultController.sections?[section].numberOfObjects
        return numberOfinASection!
    }

    // MARK: - Custom functions
    func getFtechedResultController() -> NSFetchedResultsController {
        fetchedResultController = NSFetchedResultsController(fetchRequest: taskFetchRequest(), managedObjectContext: context!, sectionNameKeyPath: nil, cacheName: nil)
        return fetchedResultController
    }

    func taskFetchRequest() -> NSFetchRequest{
        let fetchRequest = NSFetchRequest(entityName: "Contact")
        let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
        fetchRequest.sortDescriptors = [sortDescriptor]
        return fetchRequest
    }

    func controllerDidChangeContent(controller: NSFetchedResultsController) {
        // Refresh tableview to fetch all data
        tableView.reloadData()
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("ContactCell", forIndexPath: indexPath) as! ContactcellTableViewCell
        let contact = fetchedResultController.objectAtIndexPath(indexPath) as! Contact
        println(contact.name)
        cell.nameLabel?.text = contact.name
        return cell
    }

    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        let managedObject: NSManagedObject = fetchedResultController.objectAtIndexPath(indexPath) as! NSManagedObject
        context?.deleteObject(managedObject)
        context?.save(nil)
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        performSegueWithIdentifier("editContact", sender: self)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "editContact" {

        let indexPath = tableView.indexPathForSelectedRow()
        let contactController: NewCategoryViewController = segue.destinationViewController as! NewCategoryViewController
        let contact:Contact = fetchedResultController.objectAtIndexPath(indexPath!) as! Contact
        contactController.contact = contact

    }
}

} 和

   import UIKit
import CoreData


class NewCategoryViewController: UIViewController {

    // MARK: - Properties
    var contact: Contact? = nil

    // initialize the core data context:
    let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

    // MARK: - Outlets
    @IBOutlet weak var imageHolder: UIImageView!
    @IBOutlet weak var nameField: UITextField!
    @IBOutlet weak var emailField: UITextField!
    @IBOutlet weak var phoneField: UITextField!
    @IBOutlet weak var categoryField: UITextField!

    // MARK: - Actions
    @IBAction func savebtn(sender: AnyObject) {

        let entity = NSEntityDescription.entityForName("Contact", inManagedObjectContext: context!)
        let newContact = Contact(entity: entity!, insertIntoManagedObjectContext: context)
            newContact.name = nameField.text
            newContact.email = emailField.text
            newContact.phone = phoneField.text
            //newContact.photo = UIImageJPEGRepresentation(imageHolder.image, 1)

        var error: NSError?

        context?.save(&error)

        if let errorSaving = error {
            var alert = UIAlertController(title: "Alert", message: "Couldn't save contact !!!", preferredStyle: UIAlertControllerStyle.Alert)
            alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
            self.presentViewController(alert, animated: true, completion: nil)
        } else {
            nameField.text = ""
            emailField.text = ""
            phoneField.text = ""
            var alert = UIAlertController(title: "Alert", message: "Contact added", preferredStyle: UIAlertControllerStyle.Alert)
            alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil))
            self.presentViewController(alert, animated: true, completion: nil)
        }

    }


    override func viewDidLoad() {
        super.viewDidLoad()

        if contact != nil {
            nameField.text = contact?.name
            emailField.text = contact?.email
            phoneField.text = contact?.phone

        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

任何帮助将不胜感激

最佳答案

您不能将 prepareForSegue 中的发件人转换为 ContactcellTableViewCell,因为它属于 ContactsTableViewController 类型。

不是做你正在做的,为了获得indexPath,简单地做

let indexPath = tableView.indexPathForSelectedRow()

并删除这一行:

let cell = sender as! ContactcellTableViewCell

关于ios - Segue 以查看 Controller 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32738866/

相关文章:

ios - TableView 的自定义原型(prototype)单元格

ios - 如何在 TableViewCell 中将 UIButton 居中?

ios - 如何用来自另一个 ViewController 的数据填充 TableView

ios - cocoa iOS/触摸 : Keeping a subview of the UITableViewCell contentView right-aligned

ios - 根据 contentSize 调整自定义 UITableViewCell 中的 UITextView 大小

ios - 如何在 Swift 3 中将 NSData 转换为数据?

ios - 找到哪个按钮导致了 segue 操作?

swift - 是否可以在 tvOS 上使用苹果的 HLS

ios - 我如何从 iOS 移动设备访问我的思科路由器详细信息

ios - 可重复使用的自定义单元格