не могу что-то найти
Помощь с NavigationController
import UIKit
import CoreData
class NotesTableViewController: UITableViewController, NSFetchedResultsControllerDelegate {
var fetchResultsController:NSFetchedResultsController<Reminders>!
var searchController:UISearchController!
var filteredResultArray: [Reminders] = []
var reminder:[Reminders] = []
//Reminders(name:"Купить продукты", description:"Купить молоко, хлеб"),
// Reminders(name:"Доделать работу", description:"Дописать последний контактный номер")]
@IBAction func close(segue:UIStoryboardSegue){
}
func filterContentFor(searchText text: String){
filteredResultArray = reminder.filter {(reminder) -> Bool in
return (reminder.name?.lowercased().contains(text.lowercased()))!
}
}
override func viewDidLoad() {
super.viewDidLoad()
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
tableView.tableHeaderView = searchController.searchBar
searchController.searchBar.delegate = self
searchController.searchBar.barTintColor = #colorLiteral(red: 0.4666666687, green: 0.7647058964, blue: 0.2666666806, alpha: 1)
searchController.searchBar.tintColor = .white
definesPresentationContext = true
let fetchRequest: NSFetchRequest<Reminders> = Reminders.fetchRequest()
let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
if let context = (UIApplication.shared.delegate as? AppDelegate)?.coreDataStack.persistentContainer.viewContext{
fetchResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
fetchResultsController.delegate = self
do{
try fetchResultsController.performFetch()
reminder = fetchResultsController.fetchedObjects!
} catch let error as NSError{
print("Не получилось создать заметку \(error.localizedDescription)")
}
}
}
// MARK: - Fetch results controller delegate
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type {
case .insert: guard let indexPath = newIndexPath else { break }
tableView.insertRows(at: [indexPath], with: .fade)
case .delete: guard let indexPath = indexPath else { break }
tableView.deleteRows(at: [indexPath], with: .fade)
case .update: guard let indexPath = indexPath else { break }
tableView.reloadRows(at: [indexPath], with: .fade)
default:
tableView.reloadData()
}
reminder = controller.fetchedObjects as! [Reminders]
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.endUpdates()
}
// MARK: - Table view data source
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
if searchController.isActive && searchController.searchBar.text != “” {
return filteredResultArray.count
}
return reminder.count
}
func notesToDisplayAt(indexPath: IndexPath) -> Reminders {
let note: Reminders
if searchController.isActive && searchController.searchBar.text != ""{
note = filteredResultArray[indexPath.row]
} else{
note = reminder[indexPath.row]
}
return note
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! NotesTableViewCell
let note = notesToDisplayAt(indexPath: indexPath)
cell.nameLabel.text = note.name
// cell.descriptionLabel.text = note.desc
return cell
}
override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
let delete = UITableViewRowAction(style: .default, title: "Delete") { (action,indexPath) in
self.reminder.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
if let context = (UIApplication.shared.delegate as? AppDelegate)?.coreDataStack.persistentContainer.viewContext {
let objectToDelete = self.fetchResultsController.object(at: indexPath)
context.delete(objectToDelete)
do{
try context.save()
} catch{
print(error.localizedDescription)
}
}
}
return[delete]
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "detailSegue"{
if let indexPath = tableView.indexPathForSelectedRow{
let dvc = segue.destination as! NotesDetailViewController
dvc.reminder = notesToDisplayAt(indexPath: indexPath)
}
}
}
}
extension NotesTableViewController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController){
filterContentFor(searchText: searchController.searchBar.text!)
tableView.reloadData()
}
}
extension NotesTableViewController:UISearchBarDelegate{
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
if searchBar.text == “”{
navigationController?.hidesBarsOnSwipe = false
}
}
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
navigationController?.hidesBarsOnSwipe = true
}
}
Второй вью, на который переходит пользователь нажав на ячейку таблицы
import UIKit
class NotesDetailViewController: UIViewController, UITableViewDataSource,UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
var reminder:Reminders?
override func viewDidLoad() {
super.viewDidLoad()
// tableView.estimatedRowHeight = 70
// tableView.rowHeight = uitableviewautomatic
// tableView.backgroundColor = #colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1)
// tableView.separatorColor = #colorLiteral(red: 0.4666666687, green: 0.7647058964, blue: 0.2666666806, alpha: 1)
tableView.tableFooterView = UIView(frame: CGRect.zero)
title = reminder!.name
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 2
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! NotesDetailTableViewCell
switch indexPath.row {
case 0:
cell.keyLabel.text = "Название"
cell.valueLabel.text = reminder!.name
case 1:
cell.keyLabel.text = "Описание"
cell.valueLabel.text = reminder!.desc
default:
break
}
cell.backgroundColor = UIColor.clear
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
}
Мне кажется вам не нужно ничего мудрить с кнопкой Cancel. Просто сделайте сохранение в NotesDetailViewController и после возвращение назад.
Судя по коду у вас настроен делегат при изменении записей, который в свою очередь должен обновить таблицу.
Не совсем понял, сохранение должно производиться автоматически? А кнопка cancel использоваться только для перехода назад? Если все верно понял, то как сделать сохранение изменений автоматическим в coredata?
Скажем так, это уже привычное поведение, возврат/отмена находятся слева, сохранение и прочее справа.
Допустим, передвинул, а дальше как? через show переход же делался, как изменить действия кнопки?
У кнопки возврата вроде по дефолту должно работать из коробки.
Для кнопки сохранения нужно создать UIBarButton, обозначить для нее таргет и поместить в navigationItem.rightBarButtonItem
я добавил перед вью navigation controller, сделал все переходы, но почему-то после этого перестала другая VC открываться, создание самих заметок, хотя не менял там ничего
У вас изначально NavigationController стоит? В самом начале цепочки VC?
Либо покажите просто Storyboard.
Так у вас уже есть NavigationController в наале, дальше его дублировать не нужно. Он уже будет во всех последующих VC, которые будут в этой цепочке.
Просто делаете Segue Show от Notes к Notes Detail.
Так же можете попробовать перетащить в navigation bar кнопку для сохранения.
Хорошо, я все исправил, как сделать под одну кнопку сохранение и закрытие Notes Detail? Может есть советы как лучше и рациональнее сделать?