Ios 当应用程序在同一视图上时限制segue
我在我的应用程序中使用推送通知,并在单击通知时执行segue,但问题是,如果应用程序位于某个视图上,并且通知来自同一个视图,则segue在同一个视图上执行,并且该视图上出现同一个视图。我不希望这种情况发生,如果视图是相同的,那么它不应该执行segue。这是我的密码Ios 当应用程序在同一视图上时限制segue,ios,swift,segue,Ios,Swift,Segue,我在我的应用程序中使用推送通知,并在单击通知时执行segue,但问题是,如果应用程序位于某个视图上,并且通知来自同一个视图,则segue在同一个视图上执行,并且该视图上出现同一个视图。我不希望这种情况发生,如果视图是相同的,那么它不应该执行segue。这是我的密码 if application.applicationState == UIApplicationState.background{ let moduleName = userInfo.value(forKey: "c
if application.applicationState == UIApplicationState.background{
let moduleName = userInfo.value(forKey: "click_action") as! String
let timestamp = Int64(date.timeIntervalSince1970)
let description = userInfo.value(forKey: "body") as! String
let title = userInfo.value(forKey: "title") as! String
let entity = NSEntityDescription.entity(forEntityName: "Notifications", in: DataBaseController.persistentContainer.viewContext)
let managedObj=NSManagedObject(entity: entity!, insertInto: DataBaseController.persistentContainer.viewContext)
managedObj.setValue(moduleName, forKey: "click")
managedObj.setValue(description, forKey: "body")
managedObj.setValue(timestamp, forKey: "timestamp")
managedObj.setValue(title, forKey: "title")
DataBaseController.saveContext()
if (homeVC != nil){
homeVC?.performSegue(withIdentifier: moduleName, sender: homeVC)
}
}
}
homeView控制器中的方法
//MARK:- Navigation Methods
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
let backItem = UIBarButtonItem()
backItem.title = "Home"
navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
if(segue.identifier == "notificationconnew"){
let notObj = segue.destination as! NotificationsTableViewController
notObj.homeVC = self
}
}
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if identifier == segueString && self.navigationController?.viewControllers.last is MyEarningViewController{
return false
}
else{
return true
}
}
// Giving instance of HomeViewController to AppDelegate
let appDele = UIApplication.shared.delegate as! AppDelegate
appDele.homeVC = self
应用程序委托中homeVc对象的声明
class AppDelegate: UIResponder, UIApplicationDelegate{
var window: UIWindow?
var notification : NSDictionary?
var homeVC : HomeViewController?
lazy var dBhandler = DBHandler()
let date = NSDate()
并在HomeViewController的viewDidLoad中给出实例
//MARK:- Navigation Methods
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
let backItem = UIBarButtonItem()
backItem.title = "Home"
navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
if(segue.identifier == "notificationconnew"){
let notObj = segue.destination as! NotificationsTableViewController
notObj.homeVC = self
}
}
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if identifier == segueString && self.navigationController?.viewControllers.last is MyEarningViewController{
return false
}
else{
return true
}
}
// Giving instance of HomeViewController to AppDelegate
let appDele = UIApplication.shared.delegate as! AppDelegate
appDele.homeVC = self
检查这个
我发现了这一点,并注意到,当你自己调用performsgue
时,它永远不会为此调用shouldPerformSegue
。现在只有一个,那就是只有当您当前的控制器不是segue的目标控制器时,才需要调用performsgue
。因此,在AppDelegate中以这种方式进行更改
if (homeVC != nil && !(homeVC?.navigationController?.viewControllers.last is MyEarningViewController)){
homeVC?.performSegue(withIdentifier: moduleName, sender: homeVC)
}
因此,从您的HomeViewController
中删除shouldPerformSegue
,现在不需要它,通过比较homeVC的导航策略调用performSegue
。我发现了这一点,并注意到,当您自己调用performsgue
时,它将永远不会为此调用shouldPerformSegue
。现在只有一个,那就是只有当您当前的控制器不是segue的目标控制器时,才需要调用performsgue
。因此,在AppDelegate中以这种方式进行更改
if (homeVC != nil && !(homeVC?.navigationController?.viewControllers.last is MyEarningViewController)){
homeVC?.performSegue(withIdentifier: moduleName, sender: homeVC)
}
因此,从您的
HomeViewController
中删除shouldPerformSegue
,现在不需要它,通过比较homeVC的导航策略调用performSegue
。您可以用两种方法处理
如果(yourViewcontroller.isloaded){
无所事事
}否则{
执行顺序
}
或
您可以在shouldPerformSegueWithIdentifier:sender:方法中进行处理,以防止segue发生。加载视图时返回否。您可以通过两种方式进行处理 如果(yourViewcontroller.isloaded){ 无所事事 }否则{ 执行顺序 } 或
您可以在shouldPerformSegueWithIdentifier:sender:方法中进行处理,以防止segue发生。加载视图时返回否。如何获取ViewController对象,因为我不知道目标序列是什么,因为单击通知后,它可以转到任何视图,这取决于通知中的操作序列。这里的segue是{let moduleName=userInfo.value(forKey:“click_action”)as!String},我在performsgue homeVC?中使用这个模块名。performsgue(标识符:moduleName,发送者:homeVC)如果我与每个视图控制器都检查这个,它会太长,实际上还有其他方法吗,shouldperformsegue方法没有被调用,我在方法中应用了断点,但不起作用,只为segue的调用做准备called@Prathamesh您将
shouldPerformSegue
放在了错误的位置,您需要将该方法放在homeVC
的类中,因此,在变量homeVC的type类中添加该方法,因为您正在使用该控制器执行segue方法prepareforsegue和shouldPerformsegue都在HomeViewController类中,我刚刚在这里逐一粘贴了有问题的方法如何获取ViewController对象,因为我不知道目标segue是什么,因为单击通知后,它可以转到任何视图,这取决于通知中的操作segue。这里的segue是{let moduleName=userInfo.value(forKey:“click_action”)as!String},我在performsgue homeVC?中使用这个模块名。performsgue(标识符:moduleName,发送者:homeVC)如果我与每个视图控制器都检查这个,它会太长,实际上还有其他方法吗,shouldperformsegue方法没有被调用,我在方法中应用了断点,但不起作用,只为segue的调用做准备called@Prathamesh您将shouldPerformSegue
放在了错误的位置,您需要将该方法放在homeVC
的类中,因此,在变量homeVC的type类中添加该方法,因为您正在使用该控制器执行segue,而prepareforsgue和shouldPerformsegue方法都在HomeViewController类中,我刚刚在这里逐一粘贴了这个问题