Swift 从第三个 ViewController 导航到第一个 ViewController
Swift Navigate from third ViewController to the first ViewController
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let vc = storyboard?.instantiateViewController(identifier:
"PersonViewController") as? PersonViewController
vc?.names = persons[indexPath.row].emer!
vc?.lastnames = persons[indexPath.row].mbiemer!
vc?.delegate = self
PersonViewController.indexes = indexPath.row
self.navigationController?.pushViewController(vc!, animated: true)
}`
我有这样的情况:
第一个 ViewController 是一个 collectionView,第二个是 viewcontroller,当我点击一个按钮时它允许添加新的 Person 并且工作完美。我已经将委托和核心数据用于本地内存。
第二个 ViewController 还有另一个按钮可以编辑人物。当我按下按钮时,会出现一个新的 viewController,扩展名为 UIAdaptivePresentationControllerDelegate
。这个 viewcontroller 由 2 个按钮和 2 个文本框组成。因此,当我想按保存按钮时,我想转到第一个 viewcontroller(collectionview 列表),何时按取消返回到第二个 viewcontroller。
视图控制器是使用 pushViewController 方法创建的。
谁能帮我用一下?
然后在 PersonViewController 我称之为内部按钮编辑。
@objc func editCell(){
let vc = storyboard?.instantiateViewController(identifier:
"ModalPresentationViewController") as?
ModalPresentationViewController
navigationController?.pushViewController(vc!, animated: true)
}
现在 las ViewController 中的代码是 ModalViewController
@objc func savePerson(){
if editNameTextfield.text == "" || editlastNameTextfield.text == ""{
self.errorLbl.alpha = 1
}
else{
let vc = ViewController()
guard let textName = editNameTextfield.text else{
return
}
guard let textLastName = editlastNameTextfield.text else{
return
}
let index = PersonViewController.indexes
DispatchQueue.main.async {[self] in
if editDelegate != nil{
self.editDelegate!.editPerson(editedName: textName, editedLastname: textLastName, index: index)
}
}
// What should I call here??
}
}
您可以使用类似的东西:
func popTo(_ type: AnyClass) {
guard let controllers = navigationController?.viewControllers else {return}
for controller in controllers {
if controller.classForCoder == type {
navigationController?.popToViewController(controller, animated: true)
break
}
}
}
并根据条件调用函数为:
popTo(A.classForCoder())
编辑: 仅当 ViewControllers B 和 C 通过导航控制器呈现并且位于同一导航堆栈中时,以上解决方案才有效。
由于您以模态方式呈现 ViewController C,因此以下答案应该有效:
对正在展示 C 的 ViewController B 进行这些更改:
class B: UIViewController, PresenterDelegate {
// some functions
func popToPrevious() {
navigationController.popViewController(animated: false)
}
@objc func editCell(){
let vc = storyboard?.instantiateViewController(identifier:
"ModalPresentationViewController") as?
ModalPresentationViewController
vc.presenterDelegate = self
present(vc, animated: true, completion: nil)
}
}
在你的 ViewController C:
class C {
var presenterDelegate: PresenterDelegate? = nil
//
@objc func savePerson(){
//
//
dismiss(animated: true, completion: {
self.presenterDelegate?.popToPrevious()
})
}
}
同时将 PresenterDelegate 协议添加到新文件或以下 ViewControllers B 或 C
protocol PresenterDelegate {
func popToPrevious()
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let vc = storyboard?.instantiateViewController(identifier:
"PersonViewController") as? PersonViewController
vc?.names = persons[indexPath.row].emer!
vc?.lastnames = persons[indexPath.row].mbiemer!
vc?.delegate = self
PersonViewController.indexes = indexPath.row
self.navigationController?.pushViewController(vc!, animated: true)
}`
我有这样的情况:
第一个 ViewController 是一个 collectionView,第二个是 viewcontroller,当我点击一个按钮时它允许添加新的 Person 并且工作完美。我已经将委托和核心数据用于本地内存。
第二个 ViewController 还有另一个按钮可以编辑人物。当我按下按钮时,会出现一个新的 viewController,扩展名为 UIAdaptivePresentationControllerDelegate
。这个 viewcontroller 由 2 个按钮和 2 个文本框组成。因此,当我想按保存按钮时,我想转到第一个 viewcontroller(collectionview 列表),何时按取消返回到第二个 viewcontroller。
视图控制器是使用 pushViewController 方法创建的。
谁能帮我用一下?
然后在 PersonViewController 我称之为内部按钮编辑。
@objc func editCell(){
let vc = storyboard?.instantiateViewController(identifier:
"ModalPresentationViewController") as?
ModalPresentationViewController
navigationController?.pushViewController(vc!, animated: true)
}
现在 las ViewController 中的代码是 ModalViewController
@objc func savePerson(){
if editNameTextfield.text == "" || editlastNameTextfield.text == ""{
self.errorLbl.alpha = 1
}
else{
let vc = ViewController()
guard let textName = editNameTextfield.text else{
return
}
guard let textLastName = editlastNameTextfield.text else{
return
}
let index = PersonViewController.indexes
DispatchQueue.main.async {[self] in
if editDelegate != nil{
self.editDelegate!.editPerson(editedName: textName, editedLastname: textLastName, index: index)
}
}
// What should I call here??
}
}
您可以使用类似的东西:
func popTo(_ type: AnyClass) {
guard let controllers = navigationController?.viewControllers else {return}
for controller in controllers {
if controller.classForCoder == type {
navigationController?.popToViewController(controller, animated: true)
break
}
}
}
并根据条件调用函数为:
popTo(A.classForCoder())
编辑: 仅当 ViewControllers B 和 C 通过导航控制器呈现并且位于同一导航堆栈中时,以上解决方案才有效。
由于您以模态方式呈现 ViewController C,因此以下答案应该有效:
对正在展示 C 的 ViewController B 进行这些更改:
class B: UIViewController, PresenterDelegate {
// some functions
func popToPrevious() {
navigationController.popViewController(animated: false)
}
@objc func editCell(){
let vc = storyboard?.instantiateViewController(identifier:
"ModalPresentationViewController") as?
ModalPresentationViewController
vc.presenterDelegate = self
present(vc, animated: true, completion: nil)
}
}
在你的 ViewController C:
class C {
var presenterDelegate: PresenterDelegate? = nil
//
@objc func savePerson(){
//
//
dismiss(animated: true, completion: {
self.presenterDelegate?.popToPrevious()
})
}
}
同时将 PresenterDelegate 协议添加到新文件或以下 ViewControllers B 或 C
protocol PresenterDelegate {
func popToPrevious()
}