我不想重新加载视图控制器

时间:2016-09-16 07:22:08

标签: objective-c swift storyboard

我正在使用故事板&从“HomeVC”转到“MapVC”。

HomeVC - > segue - > MapVC

由于嵌入了导航控制器,MapVC会自动返回按钮。

现在,当我再次来自HomeVC-> MapVC时,MapVC正在重新加载。我不想要的。有没有办法避免以编程方式进行。

5 个答案:

答案 0 :(得分:2)

我不会使用segue而是使用IBAction并手动执行:

e.g。

  1. 挂钩UIButton(或其他)以触发@IBAction func buttonClicked(sender: UIButton!)

  2. 将mapVC作为插座引用:@IBOutlet var mapVC:MyMapViewController! [注意:您也可以手动初始化VC]

  3. 实施推动同一mapVC的动作

    @IBAction func buttonClicked(sender: UIButton!) {
        navigationController.pushViewController(mapVC, animated:true)
    }
    
  4. 恕我直言最简单/务实

    替代想法:保留segue,但将其连接到空白VC。在prepareForSegue中,将mapVC添加为segue的destinationViewController的子项

    IMO这是不好的

    最佳方式认为:使mapVC正确持久,并根据您在homeVC中保存的某些状态重新加载它的视图。 keep visibleRegion

    恕我直言,这是最好的,也就是VC的使用方式

答案 1 :(得分:1)

当您从MapVC推送HomeVC时,每次都会创建一个MapVC的新对象。它不是重新加载MapVC,而是每次都创建一个新实例。

答案 2 :(得分:0)

如果您正在使用Storyboard Segues,则每次执行Segue时都会创建一个MapVC的新实例。这就是Segue的工作方式。要解决这个问题,您可以在HomeVC中对MapVC进行强有力的引用,然后再推送它。涉及的步骤是删除故事板中的Segue并在MapVC上分配Storyboard标识符。您可能希望创建一个@IBAction添加到按钮以触发推送。假设您在故事板中将"idMapVC"设置为MapVC的标识符。你最终会得到这样的代码:

class HomeVC: UIViewController {
    var mapVC: MapVC?

    override func viewDidLoad() {
        super.viewDidLoad()

        mapVC = storyboard?.instantiateViewController(withIdentifier: "idMapVC") as? MapVC
    }

    @IBAction func pushTheMap() {
        guard let mapVC = self.mapVC
            else { return }

        navigationController?.pushViewController(mapVC, animated: true)
    }
}

答案 3 :(得分:0)

你真正想要实现的目标是什么?你不想显示MapVC的视图吗?

如果你在MapVC中存储了一些正在丢失的状态,那么你正在做一些非常非常错误的事情。 VC代表View Controller。它控制着视图。它绝不能包含您的数据。所以删除一个视图控制器并创建一个新视图应该是绝对无痛的。

答案 4 :(得分:0)

ViewController始终先加载stack ,最后输出所以当您使用push segue连接任何viewController时,首先加载整个viewController在内存中,当你回到之前加载的视图时,它将不会再次加载,因此进程会继续进行。

如果您选择,这是一个特里克。您需要相应地在NSUserDefault dispatch_once方法中使用MapVC GCD块将viewDidLoad键设置为true,并在加载之前进行检查。

示例:

// MapVC viewController
- (void)viewDidLoad {
    [super viewDidLoad];
    static dispatch_once_t pred;
         static id shared = nil;
        dispatch_once(&pred, ^{
            // set the key true here
    });    

    if([[[NSUserDefaults standardUserDefaults] valueForKey:@"yourKey"] isEqualToString:@"true"]){
        // code here which you do not wish to execute again and again
        // Note: set the key false here so this block will not execute again
    }

}

注意:如果您想再次执行该特定代码,请将密钥设置为其他地方。