为什么我的prepareForSegue方法没有被调用?

时间:2017-07-04 01:35:44

标签: ios swift uinavigationcontroller uistoryboardsegue

当我按下此导航控制器中的后退按钮时,我想将开关的状态发送到另一个视图控制器中的变量。但是,没有调用prepareForSegue方法。我该如何解决这个问题?

enter image description here

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    print("here")
    let secondViewController:ViewController2 = segue.destination as! ViewController2

    if undoSwitch.isOn {
        secondViewController.undoControls[0] = true
    }
    else {
     secondViewController.undoControls[0] = false
    }
}

3 个答案:

答案 0 :(得分:0)

后退按钮与segue不同。如果要在从当前视图控制器返回时重新加载undoSwitch。其中一种方法是使用静态全局变量。像

这样的东西
class AppVar {
    static var controlState = true
}

在您需要的地方更新您的AppVar.controlState并添加此

if AppVar.controlState {
    secondViewController.undoControls[0] = true
}
else {
     secondViewController.undoControls[0] = false
}

viewWillAppear ViewController2 ViewController2viewWillAppear被保留并存储在堆栈中。当您导航回到它时,将调用public static function getAllTimeLeaders($request) { $competitionIds = self::getLasTwoSeason(); $data = DB::table('leader_board_stats as lbs') ->select([ DB::raw('AVG(sGamesStarted)'), DB::raw('AVG(sMinutesAverage)'), DB::raw('AVG(sPointsAverage)'), DB::raw('AVG(sFieldGoalsMadeAverage)'), DB::raw('AVG(sFieldGoalsAttemptedAverage)'), DB::raw('AVG(sFieldGoalsPercentage)'), DB::raw('AVG(sTwoPointersMadeAverage)'), DB::raw('AVG(sTwoPointersAttemptedAverage)'), DB::raw('AVG(sThreePointersMadeAverage)'), DB::raw('AVG(sThreePointersAttemptedAverage)'), DB::raw('AVG(sThreePointersPercentage)'), DB::raw('AVG(sFreeThrowsMadeAverage)'), DB::raw('AVG(sFreeThrowsAttemptedAverage)'), DB::raw('AVG(sReboundsTotalAverage)'), DB::raw('AVG(sAssistsAverage)'), DB::raw('AVG(sStealsAverage)'), DB::raw('AVG(sBlocksAverage)'), DB::raw('AVG(sTurnoversAverage)'), DB::raw('AVG(sFoulsPersonalAverage)'), 'firstName', 'familyName', 'personId', 'teamId', 'competitionId' ]) ->where('lbs.periodNumber', '0') ->whereIn('lbs.competitionId', [$competitionIds[0]->competitionId, $competitionIds[1]->competitionId]) ->groupBy('lbs.personId') ->get(); dd($data); }

答案 1 :(得分:0)

重写您的self.navigationItem.leftBarButtonItem,为其添加操作,并执行您想要的任何操作。 或者使用https://github.com/onegray/UIViewController-BackButtonHandler

答案 2 :(得分:0)

如果要将数据从ViewControllerA发送到ViewControllerB,您可以使用prepare for segue方法传递数据或实例化ViewControllerB故事板ID并访问其属性并传递数据。

如果您想反之亦然,即将数据从ViewControllerB传回ViewControllerA,您可以使用各种模式。授权,通知,Kvo或使用NSUserDefaults。

在您的情况下,委托模式将是最好的。将ViewController2指定为当前类的委托。并使用当前类的协议传递数据(在您的情况下控制状态)。在ViewController2中实现协议并访问交换机的控制状态并相应地执行。您可以在此主题中引用我之前的ans。查看我在Objective-C中的详细信息here。 希望能帮助到你。 Hapy Coding !!