如果我 return 返回 Swift 如何在不重新加载视图的情况下移动视图

How to move through Views without reload them again if I return back Swift

我将给出一个我想要的例子,这样就不会那么混乱了:

示例:

假设我有一张地图,每当我的用户动态滚动 3 个注释时它就会添加。现在我在地图下面有一个按钮,当我按下它时,我会转到另一个 viewController 做我想做的事,然后回到 viewController 和地图,现在我想找到我的所有注释地图有但根本没有重新加载视图。

我曾经使用这个函数在 viewController 之间移动:

func move(identifier: String , viewController : UIViewController) -> Void {
    let mstoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let vc: UIViewController = mstoryboard.instantiateViewControllerWithIdentifier(identifier) 
    viewController.presentViewController(vc, animated: true, completion: nil)
}

我也试过这个:

let vc = self.storyboard?.instantiateViewControllerWithIdentifier("view") as? MyViewcontroller
         self.presentViewController(vc!, animated: true, completion: nil)

这两个当我使用它们时出现的 viewcontroller 正在调用 viewDidload 所以它就像第一次出现一样。

另一个例子是 tabBarViewController 如果您注意到当您浏览选项卡时没有任何重新加载(唯一调用的函数是 viewDidAppear

编辑

test file

问题是由于导航回另一个控制器时地图控制器被释放,而当您想再次移动到地图屏幕时创建另一个控制器。

您需要的是保持同一个控制器实例,并呈现该实例。在呈现控制器中保持强引用就足够了。

class PresentingController {
    // making the property lazy will result in the getter code
    // being executed only when asked the first time
    lazy var mapController = { () -> UIViewController in
        let mstoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        return mstoryboard.instantiateViewControllerWithIdentifier("mapControllerIdentifier")
    }()

    func moveToMap() {
        // simply use the mapController property
        // the property reference will make sure the controller won't
        // get deallocated, so every time you navigate to that screen
        // you'll get the same controller
        presentViewController(mapController, animated: true, completion: nil)
    }
}

根据您发布的同一个项目,您在从 view 2 返回 view 1[=37= 时实例化了一个新的 UIViewController ] 这就是为什么您的 viewDidLoad 被再次调用并且您的整个地图视图被重新加载的原因。

在您的示例项目中,而不是

lazy var mapController2 = { () -> UIViewController in
    let mstoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    return mstoryboard.instantiateViewController(withIdentifier: "first")
}

您应该在按下按钮时关闭 视图 2

@IBAction func butto(_ sender: AnyObject) {
      //Your initial code
      //PresentingController().moveToMap(self, flag: 1)

      self.dismiss(animated: true, completion: nil)
}

当您呈现新的 UIViewController 时,旧的 UIViewController 不会从内存中删除,它只是隐藏在新的 UIViewController 后面。因此,无论何时您希望 返回 并保持之前的状态 UIViewController,您需要做的就是关闭新的 UIViewController

但是,如果您正在执行您在第二个 UIViewController 执行的某些任务,并且您希望在初始 UIViewController 中反映出来,您将必须设置闭包来更新您的初始 UIViewController