2016-12-30 16 views
3

我会给我要那么它不是那么混乱的一个例子:如何通过无需再次重新加载视图中移动如果就回国了斯威夫特

例子:

比方说,我有一个地图每次我的用户动态滚动3个注释都会添加。现在我在地图下面有一个按钮,当我按下按钮时,我会转到另一个viewController,按照我想要的操作并返回到带有地图的viewController,现在我想查找我的地图有的所有注释,而不是重新加载视图所有。

我用这个功能,我做出viewControllers之间移动:

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

+0

如果你正在使用'presentViewController',那么你可以在该控制器上执行'dismiss(animated:true,completion:nil)'来返回到前一个,而不用重新加载 – mursang

回答

1

根据您发布的同一个项目,你从观点去2图1当实例化一个新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

+0

谢谢您的回答,我会尝试,并取回尽快告诉你结果,我会检查它 –

+0

谢谢Rikh,作为我的工作通缉 –

2

问题是由以下事实引起的当导航回到另一个控制器时,地图控制器会被取消分配,而当您想要再次移动到地图屏幕时会创建另一个地图控制器。

你需要的是坚持到相同的控制器实例,并提出一个。在呈现控制器中保留一个强有力的参考就足够了。

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

谢谢你的回答,对不起,我没有'不早回复,我把你的代码,但我有两个错误,第一个无法推断当前上下文中关于lazy var和使用未解析的标识符'存在'当前上下文返回类型。我的方式 –

+0

@mikevorisis我通过指定关闭返回类型更新代码的使用SWIFT 2,检查代码的工作现在 – Cristik

+0

谢谢你,我无法测试,但现在当我这样做,我会通知你 –