Подтвердить что ты не робот

Функция вызова из другого класса swift

Мне не удалось вызвать функцию в моем GameViewController.swift из другого класса, Menu.swift. Я вызываю функцию следующим образом:

class Menu: SKnode {

    func scoreAction(sender:UIButton!) { 
        self.buttonPlay.removeFromSuperview()
        self.buttonScore.removeFromSuperview()
         // CALLING FUNCTION
        GameViewController.showLeaderboard()    
     }
}

И вот функция, которую я пытаюсь вызвать:

class GameViewController: UIViewController,
 UITextFieldDelegate, GKGameCenterControllerDelegate  {

   func showLeaderboard()
    {
      var gcViewController: GKGameCenterViewController = GKGameCenterViewController()
      gcViewController.gameCenterDelegate = self

      gcViewController.viewState = GKGameCenterViewControllerState.Leaderboards
      gcViewController.leaderboardIdentifier = "yourleaderboardid"

      self.presentViewController(gcViewController, animated: true, completion: nil)
    }

}

У меня ошибка компилятора внутри моего класса меню в строке GameViewController.showLeaderboard() "Отсутствует аргумент для параметра №1 при вызове". Но я не понимаю, какой тип аргумента ожидает компилятор, потому что я объявил функцию без каких-либо параметров.

Спасибо

4b9b3361

Ответ 1

В GameViewController вы определили scoreAction как instance метод, а не функцию class. Вы должны вызвать scoreAction, создав экземпляр GameViewController

class Menu: SKnode {

    func scoreAction(sender:UIButton!) { 
        self.buttonPlay.removeFromSuperview()
        self.buttonScore.removeFromSuperview()
         // CALLING FUNCTION 
         //see () on GameViewController
        GameViewController().showLeaderboard()    
     }
}

Я думаю, вы должны загрузить GameViewController из storyBoard, если у вас есть GameViewController в storyBoard

Ответ 2

Если вы хотите выполнить какой-либо метод для действия в другом классе, вы должны использовать протокол.

//вне 1-го класса

protocol abc {
     func xyz()
}

//Внутри 1-го класса

var delegate: abc?

//Внутри 1-го класса на действии

self.delegate.xyz()

//Внутри второго класса вы хотите выполнить метод

extension 2nd: abc {
    func xyz(){
      //code 
   }
}

//Внутри 2-го класса, где выполняется экземпляр процесса

let obj = 2nd initialiser
obj.delegate = self

Надеюсь это поможет.