Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当应用程序在同一视图上时限制segue_Ios_Swift_Segue - Fatal编程技术网

Ios 当应用程序在同一视图上时限制segue

Ios 当应用程序在同一视图上时限制segue,ios,swift,segue,Ios,Swift,Segue,我在我的应用程序中使用推送通知,并在单击通知时执行segue,但问题是,如果应用程序位于某个视图上,并且通知来自同一个视图,则segue在同一个视图上执行,并且该视图上出现同一个视图。我不希望这种情况发生,如果视图是相同的,那么它不应该执行segue。这是我的密码 if application.applicationState == UIApplicationState.background{ let moduleName = userInfo.value(forKey: "c

我在我的应用程序中使用推送通知,并在单击通知时执行segue,但问题是,如果应用程序位于某个视图上,并且通知来自同一个视图,则segue在同一个视图上执行,并且该视图上出现同一个视图。我不希望这种情况发生,如果视图是相同的,那么它不应该执行segue。这是我的密码

 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类中,我刚刚在这里逐一粘贴了这个问题