Помощь с NavigationController

swift

#21

не могу что-то найти


#22

покажите хоть код VC


#23

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


#24

Второй вью, на который переходит пользователь нажав на ячейку таблицы

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

}


#25

Мне кажется вам не нужно ничего мудрить с кнопкой Cancel. Просто сделайте сохранение в NotesDetailViewController и после возвращение назад.
Судя по коду у вас настроен делегат при изменении записей, который в свою очередь должен обновить таблицу.


#26

Не совсем понял, сохранение должно производиться автоматически? А кнопка cancel использоваться только для перехода назад? Если все верно понял, то как сделать сохранение изменений автоматическим в coredata?


#27

Автоматически ничего не будет. Вам нужно написать самому код сохранения.


#28

Создать новую кнопку только под сохранение? Или что лучше использовать


#29

Лучше поместить ее в navigationBar справа


#30

Какая разница положения кнопки cancel?


#31

Скажем так, это уже привычное поведение, возврат/отмена находятся слева, сохранение и прочее справа.


#32

Допустим, передвинул, а дальше как? через show переход же делался, как изменить действия кнопки?


#33

У кнопки возврата вроде по дефолту должно работать из коробки.
Для кнопки сохранения нужно создать UIBarButton, обозначить для нее таргет и поместить в navigationItem.rightBarButtonItem


#34

Разве при обычном show можно поставить UIBarButton?


#35

А что мешает?
Эдинственная проблема будет, если нету navigation bar’a.


#36

я добавил перед вью navigation controller, сделал все переходы, но почему-то после этого перестала другая VC открываться, создание самих заметок, хотя не менял там ничего


#37

У вас изначально NavigationController стоит? В самом начале цепочки VC?
Либо покажите просто Storyboard.


#38

В первом вью список заметок, при нажатии на ячейку открывается развернутое описание заметки


#39

Так у вас уже есть NavigationController в наале, дальше его дублировать не нужно. Он уже будет во всех последующих VC, которые будут в этой цепочке.
Просто делаете Segue Show от Notes к Notes Detail.
Так же можете попробовать перетащить в navigation bar кнопку для сохранения.


#40

Хорошо, я все исправил, как сделать под одну кнопку сохранение и закрытие Notes Detail? Может есть советы как лучше и рациональнее сделать?