【问题标题】:Restrict segue when app is on same view iOS Swift当应用程序在同一视图上时限制 segue iOS Swift
【发布时间】:2017-05-22 07:12:32
【问题描述】:

我在我的应用程序中使用推送通知并在点击通知时执行 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
    }
}

在 App Delegate 中声明 homeVc 对象

class AppDelegate: UIResponder, UIApplicationDelegate{

var window: UIWindow?
var notification : NSDictionary?
var homeVC : HomeViewController?
lazy var dBhandler = DBHandler()
let date = NSDate()

并在 HomeViewController 的 viewDidLoad 中给出实例

// Giving instance of HomeViewController to AppDelegate
    let appDele = UIApplication.shared.delegate as! AppDelegate
    appDele.homeVC = self

检查这个 enter image description here

【问题讨论】:

    标签: ios swift segue


    【解决方案1】:

    我遇到了这个SO thread 并注意到,当你自己打电话给performSegue 时,它永远不会为此打电话给shouldPerformSegue。现在只有一个,即只有当您当前的控制器不是 segue 的目标时,您才需要调用 performSegue。所以像这样在 AppDelegate 中进行更改。

    if (homeVC != nil && !(homeVC?.navigationController?.viewControllers.last is MyEarningViewController)){
         homeVC?.performSegue(withIdentifier: moduleName, sender: homeVC)
    }
    

    所以从你的HomeViewController 中删除shouldPerformSegue 现在不需要它并通过比较homeVC 的navigationStack 来调用performSegue

    【讨论】:

    • 如何获取 YourviewController 对象,因为我不知道目标 segue 将是什么,因为单击通知时它可以转到任何视图,具体取决于通知中的动作 segue。这里转场来了 {let moduleName = userInfo.value(forKey: "click_action") as! String} 我在 performegue homeVC?.performSegue(withIdentifier: moduleName, sender: homeVC) 中使用这个模块名称
    • 要不要对每个视图控制器都检查一下,太长了,有没有其他方法
    • 实际上,shouldperformsegue 方法没有被调用,我在方法中应用了断点但没有工作,只为调用 segue 做准备
    • @Prathamesh 你把shouldPerformSegue 放在了错误的地方,你需要把那个方法放在homeVC 的类中,所以在你的变量homeVC的类型类中添加这个方法,因为你正在执行segue控制器
    • prepareforsegue 和 shouldPerformsegue 方法都在 HomeViewController 类中,我一个接一个地粘贴到这里
    【解决方案2】:

    你可以通过两种方式处理

    if(yourViewcontroller.isloaded){ 没做什么 }别的{ 执行序列 }

    你在 shouldPerformSegueWithIdentifier:sender: 方法中处理让你有机会防止 segue 发生。加载视图时返回 NO。

    【讨论】:

      猜你喜欢
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 2013-05-24
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      相关资源
      最近更新 更多