从Appdelegate实例化视图控制器

问题描述 投票:0回答:2

如果推送通知进入并且用户点击它,我通过以下代码加载特定的视图控制器:

let tabbarController = storyboard.instantiateViewControllerWithIdentifier("employerTabBarViewController") as! UITabBarController
tabbarController.selectedIndex = 0

self.window?.rootViewController = tabbarController
let navigationController = tabbarController.viewControllers?.first as!     UINavigationController
var applicantsVC = storyboard.instantiateViewControllerWithIdentifier("ApplicantsViewController") as! ApplicantsViewController
applicantsVC.job = job

navigationController.pushViewController(applicantsVC, animated: false)
self.window?.makeKeyAndVisible()

我的问题是:这个代码是否一遍又一遍地为每个被点击的通知消息实例化ViewControllers,以便智能手机的内存越来越多地被使用?如果是这种情况,我可以在初始化新应用之前摆脱已经由应用程序的先前用法初始化的所有ViewControllers吗? popToRootViewController有帮助吗?

**更新**我尝试了两个推荐,但每次点击通知消息时,内存使用量增加了大约10 MB。也许它与我在AppDelegate中初始化ViewControllers的方法无关,但我加载“ApplicantsViewController”的方式或用let storyboard = UIStoryboard(name: "Main", bundle: nil)初始化Storyboard导致这种效果?

这是ApplicantsViewController的初始化(我也没有注释reloadData()var tableViewController = UITableViewController() - 这并没有阻止内存增加):

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var openPositionsStatus: UILabel!
@IBOutlet weak var changeJobOfferStatusButton: UIBarButtonItem!

var job : JobOffer?
var favorites = [Employee]()
var applicants = [Employee]()
var applications = [Application]()
var takenPositions = 0
var refreshControl : UIRefreshControl?
var offeredJobsVC : OfferedJobsViewController?

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "receiveNotification:", name: "refreshApplicants", object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "receiveNotification:", name: "jobOfferStatusChanged", object: nil)
}


deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.delegate = self

    Helper.setBackground(self)

    refreshControl = UIRefreshControl()
    refreshControl!.addTarget(self, action: Selector("reloadData"), forControlEvents: UIControlEvents.ValueChanged)

    self.updateJobOfferActionButton(self, jobOffer: self.job!, button: self.changeJobOfferStatusButton)


    var tableViewController = UITableViewController()
    tableViewController.tableView = self.tableView
    tableViewController.refreshControl = refreshControl
    // call reloadData after refreshControl solved sorting problems
    reloadData()

}
ios swift viewcontroller appdelegate
2个回答
0
投票

是的,它会导致越来越多的ViewController堆叠在导航控制器中。我的选择是在appDelegate中创建一个全局变量

var applicantsVC:ApplicantsViewController?

并在通知功能进来,做这样的事情:

if (applicantsVC == nil){
     self.applicantsVC = storyboard.instantiateViewControllerWithIdentifier("ApplicantsViewController") as! ApplicantsViewController
}

0
投票

不,您不会在每次推送通知上分配更多内存,而是重新分配该内存。

每次你创建UITabBarController的新实例并将其作为rootViewController用于UIWindow实例:

let tabbarController = storyboard.instantiateViewControllerWithIdentifier("employerTabBarViewController") as! UITabBarController  
self.window?.rootViewController = tabbarController  

这意味着每次你用视图控制器的全部赌注释放当前的tabBarController,并分配新的。你很擅长这种方式。

© www.soinside.com 2019 - 2024. All rights reserved.