如果我 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
)
编辑
问题是由于导航回另一个控制器时地图控制器被释放,而当您想再次移动到地图屏幕时创建另一个控制器。
您需要的是保持同一个控制器实例,并呈现该实例。在呈现控制器中保持强引用就足够了。
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
。
我将给出一个我想要的例子,这样就不会那么混乱了:
示例:
假设我有一张地图,每当我的用户动态滚动 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
)
编辑
问题是由于导航回另一个控制器时地图控制器被释放,而当您想再次移动到地图屏幕时创建另一个控制器。
您需要的是保持同一个控制器实例,并呈现该实例。在呈现控制器中保持强引用就足够了。
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
。