Евгений
только его надо кастануть будет
Евгений
потому что так-то он будет просто UIViewController
Alexander
сделал так let prevController = self.presentingViewController as! SetListViewController
Alexander
получил Could not cast value of type 'UINavigationController' (0x10cc69008) to SetListViewController
Stanislav
можно кинуть Notification, можно контроллеру передать блок, который он выполнит перед закрытием
Stanislav
Alexander
видно. но для меня пока не очевидно как получить именно setListcontroller
Alexander
как-то аля self.presentingViewController.контроллер as! SetListViewController
Stanislav
как ты презентишь контроллер добавления записи?
Alexander
в верхнем нав табе кнопочка
Alexander
+
Stanislav
Ну или тип такого
let navVC = self.presentingViewController as! UINavigationController
let prevController = navVC.visibleViewController as! SetListViewController
Stanislav
Alexander
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "AddSetButtonPressed") {
let controller = segue.destination as! AddSetViewController
controller.exercise = self.exercise!
controller.workout = self.workout
}
}
Stanislav
Ааа, тут еще и сториборд
Stanislav
Имхо нотификейшн проще всего
Alexander
можно ссылочку почитать что это
Alexander
и если возможно то пример
Stanislav
http://stackoverflow.com/questions/24049020/nsnotificationcenter-addobserver-in-swift
Stanislav
Вот тут пример как подписаться
Alexander
спасибо
Stanislav
а, ну ниже есть и как отправить
Stanislav
Общий смысл - есть NotificationCenter, это фигня, которая позволяет отправлять сообщения по ключу.
В контроллере с данными ты подписываешься на сообщения. Ключ какой-нибудь свой делаешь (это строка). И устанавливаешь метод, который дернется при получении такого сообщения. В этом методе уже апдейтишь tableView или что там у тебя.
В контроллере с добавлением записи после успешного добавления ты просто отправляешь сообщение по ключу.
Контроллер списка его поймает и сделает обновление.
Главное потом контроллер списка надо отписать от центра этого
𝔗𝔞𝔯𝔞𝔰
Доброй ночи)
Помогите, пожалуйста, решить вопрос. На stackoverflow не сильно помогли :(
http://stackoverflow.com/questions/41703230/dashed-uibezierpath-subpath-junctions
Alexander
а. тригеры (аналогия js)
Alexander
смысл понял
Alexander
щас гляну реализацию. спасибо за наводку.
Alexander
хотел попробовать проще и быстрее
Alexander
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "AddSetButtonPressed") {
let controller = segue.destination as! AddSetViewController
controller.exercise = self.exercise!
controller.workout = self.workout
controller.setListController = self
}
}
Alexander
добавил controller.setListController = self
Alexander
и собсна dismiss(animated: true, completion: nil)
self.setListController!.tableView.reloadData()
Alexander
но не сработало
Stanislav
Ну так писать это на самом деле некрасиво
Alexander
я понимаю что это костыли
Alexander
просто решил попробовать. вникаю так сказать
Stanislav
Хотя странно, что не заработало
Stanislav
Stanislav
Живой ли этот setListController
Alexander
там же ! стоит - ошибка бы была
Alexander
но вообще вот скрин https://yadi.sk/i/PZ8PMe9s3A4xqg
Stanislav
А. Я просто свифт не знаю. Тогда вдвойне странно
Stanislav
Хм
Stanislav
Попробуй до дисмисса его дёрнуть
Stanislav
Раз уж так)
Alexander
ничего не изменилось
Stanislav
Стоп
Stanislav
А данные для tableView ты как вообще берешь?
Евгений
никак
Stanislav
Толку от reloadData, если у тебя они не менялись
Stanislav
Сделай в своём контроллере метод needUpdateData
Alexander
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (self.fetchedResultsController != nil) {
if self.fetchedResultsController!.fetchedObjects!.count == 0 {
do {
try self.fetchedResultsController!.performFetch()
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
}
return self.fetchedResultsController!.fetchedObjects!.count
} else {
return 0
}
}
Stanislav
В нем сначала заново считай данные (в массив или как они там лежат), а потом дёрни reloadData
Stanislav
Ну, тут тож понятно
Stanislav
Он у тебя в этом методе и не загрузит их заново
Alexander
точно NSFetchedResultsControllerDelegate не причем?
Stanislav
Тут другая ситуация
Stanislav
У тебя проверяется есть ли объекты только в первый раз
Stanislav
И они грузятся
Stanislav
А в следующий вызов у тебя count!=0
Alexander
ща гляну заходит ли туда вообще
Stanislav
Убери проверку на count == 0
Stanislav
Чтобы всегда делало performFetch
Stanislav
И попробуй свой вариант
Stanislav
Что на скрине был
Alexander
да. эта проверка срабатывает
Mikhail
public var fetchedResultsController: NSFetchedResultsController<your instance>? {
didSet {
if let frc = fetchedResultsController {
if frc != oldValue {
frc.delegate = controller
do {
try performFetch()
} catch {
print(error)
}
}
} else {
controller.tableView.reloadData()
}
}
}
public func performFetch() throws {
if let frc = fetchedResultsController {
defer {
controller.tableView.reloadData()
}
do {
print("fetched")
try frc.performFetch()
} catch {
throw error
}
}
}
Stanislav
да. эта проверка срабатывает
попробуй убрать временно
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (self.fetchedResultsController != nil) {
do {
try self.fetchedResultsController!.performFetch()
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
return self.fetchedResultsController!.fetchedObjects!.count
} else {
return 0
}
}
Stanislav
Вот так
Alexander
да. так работает
Alexander
но я этот пример где-то скопипиздил
Stanislav
Stanislav
в нем
{
do {
try self.fetchedResultsController!.performFetch()
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
self.tableView.reloadData()
}
Stanislav
а на dismiss вызови self.setListController!.needUpdateData()
Alexander
вариант
Alexander
спасибо. завел то что хотелось. правда не покидает мысль что накостылял жутко...
Stanislav
Ну, судя по кускам кода, там и до этого костылей хватало 😄
Max
у меня есть uitableviewcontroller из которого я в модальном окне добавляю строку в базу
1. назначь TableVC делегатом второго VC
2. второй VC презентуется, например, по методу делегата didSelectRow... - у него протокольный метод, обновляющий модель
3. по завершении добавления данных:
UI - второй VC сворачивается, обновляется модель
TableVC реализует протокольный метод второго VC, в нем передаются в качестве параметров а) экземпляр второго VC б) данные какие-нибудь нужные, TableVC по завершении вызывает reloadData()
как презентовать-убрать второй контроллер, собссно, разницы большой нет: модально или пушить в стек, кому что больше подходит
Max
ну естественно у второго VC ты прописываешь протокол с 1 методом
Alexander
сколько непонятных слов...попробую вкурить