如何从appdelegate中的viewcontroller调用函数? (SWIFT)

时间:2017-08-01 08:36:23

标签: swift

所以基本上我试图在AppDelegate.swift中运行函数Refresh(位于ViewController.swift中)。在寻找5小时的大部分时间之后,我无法弄清楚为什么这不起作用。 这是我的功能:

    func Refresh(){
    if(Count==0 && QuickActionChecker==true){
        Previous.text=String(TipArray[CountCurrent])
        Current.text=String(TipArray[CountCurrent])
        Deliveries.text="\(Runs)"

    }
    if(Count>0 && QuickActionChecker==true){
        Previous.text=String(TipArray[CountCurrent-1])
        Current.text=String(Total)
        Deliveries.text="\(Runs)"
    }
}

在我的Appdelegate.swift中,我通过将ViewController设置为Main来初始化它:

let Main = ViewController()

这是我尝试运行该功能的地方(强制从主屏幕触摸快速操作):

    func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
    if shortcutItem.type == "com.Sicarix.Ticket.Add5"{
        if(CountCurrent==0){
            TipArray.append(5)
            Count=Count+1
            CountCurrent=CountCurrent+2
            Total=TipArray.reduce(0) {$0+$1}
            Runs=Runs+1
            QuickActionChecker=true
            Main.Refresh()
        }
        else{
            TipArray.append(5)
            Count=Count+1
            CountCurrent=CountCurrent+1
            Total=TipArray.reduce(0) {$0+$1}
            Runs=Runs+1
            QuickActionChecker=true
            Main.Refresh()
        }
    }
}

但是,当我尝试使用快捷方式时,它会将应用程序打开到白色屏幕并保持不变。控制台正在吐出:

  

致命错误:在解包可选值时意外发现nil

当我删除Main.Refresh()时代码运行正常,它只是不更新​​我的应用程序中的标签,因此需要该功能。 请帮助,我已经准备好继续过去这个bug了.... 另外请记住,我还没有快速编写一周的编码,所以请尽可能地分解错误。 TIA

2 个答案:

答案 0 :(得分:0)

更改viewController对象

let nextVC = storyboard?.instantiateViewController(withIdentifier:"ViewController") as! ViewController

答案 1 :(得分:0)

问题是您使用ViewController实例化新ViewController(),并且ViewController未添加到视图控制器层次结构中。

您需要使用Storyboard使用ViewControllerlet mainVC = UIStoryboard(name: "Main", bundle: "nil").instantiateViewController(withIdentifier:"ViewController") as! ViewController进行实例化,并确保在Storyboard中设置了您的标识符。

如果您没有使用Storyboard,另一种解决方案是将您要在UI上显示的文本存储在数据源变量中,并仅在“AppDelegate”中更新这些变量,然后加载这些变量的内容放在您的标签上,并且在视频内显示了这些变量。或者' viewWillAppear'。