-->

Set navbar item button to new title

2019-08-11 02:31发布

问题:

Good day. I'm facing a weird issue, I'd like to set the right navigation item to Done in my next when I've selected a row. I tried it, and it's worked. But it's breaking however, because the function which implements the doneEditing body, is only in the next view controller, any help will be really appreciated. This is my code:

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

            let indexPath = tableView.indexPathForSelectedRow()
            let destinationVC: NewCategoryViewController = segue.destinationViewController as! NewCategoryViewController
            let contact:Contact = fetchedResultController.objectAtIndexPath(indexPath!) as! Contact
            destinationVC.contact = contact
            var rightAddBarButtonItem:UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "doneEditing:")
            destinationVC.navigationItem.rightBarButtonItem = rightAddBarButtonItem
        }
    }

and my next view controller is :

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: "Notification", 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()
    self.title = contact?.name

    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.
}

func doneEditing() {

}

}

回答1:

change target from self to destinationVC.

Use this:

var rightAddBarButtonItem:UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: destinationVC, action: "doneEditing:")

self should be used when the selector is defined in the same class which makes the call. In this case the selector is in a separate class.

OR

I would suggest you to add the right bar button in the viewDidLoad method of NewCategoryViewController. In which case the code will be:

self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "doneEditing:")

AND implement doneEditing: method as

func doneEditing(sender: UIBarButtonItem) {

}