У меня есть два ViewController, FirstViewController и SecondViewController. У обоих есть собственный файл Swift, FirstViewController.swift и SecondViewController.swift.

FirstViewController.swift содержит:

class FirstViewController: UIViewController {
    @IBAction func callFunctionInOtherClass(sender: AnyObject) {
//        Call "func showAlert" in SecondViewController when clicking the UIButton in FirstViewController
    }
}

SecondViewController.swift содержит:

class SecondViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!

    func showAlert(sender: AnyObject) {
        let alert = UIAlertView(title: "Working!", message: "This function was called from FirstViewController!\nTextField says: \(textField.text!)", delegate: nil, cancelButtonTitle: "Okay")
        alert.show()
    }
}

Я хочу иметь возможность вызывать func showAlert() в SecondViewController при нажатии на UIButton в FirstViewController.

Я уже потратил много ночей, чтобы найти решение, но ни одно не помогло. Кто-нибудь знает, что делать для достижения этой цели?

Я загрузил здесь образец проекта Xcode: CallFuntionInOtherClassX | filedropper.com

P.S .: Конечно, я мог бы опубликовать код и объяснить, какую ошибку я получаю, но я думаю, что это неразумно, потому что я действительно не знаю, как это сделать.

1
user6792802 5 Сен 2016 в 13:06

4 ответа

Лучший ответ

Вы можете использовать NSNotificationCentre для выполнения этой задачи.

В методе viewDidLoad вашего класса SecondViewController зарегистрируйте себя как наблюдателя для получения широковещательных уведомлений: -

override func viewDidLoad() {
    NotificationCenter.default.addObserver(self, selector: #selector(showAlert), name: NSNotification.Name(rawValue: "callForAlert"), object: nil)
}

А в методе действия кнопки FirstViewController вы должны запустить уведомление, написав: -

@IBAction func callFunctionInOtherClass(sender: AnyObject) {
    //Call "func showAlert" in SecondViewController when clicking the UIButton in FirstViewController
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "callForAlert"), object: nil)
}

Не забудьте вызвать removeObserver в методе SecondViewController viewDidUnload.

7
Pankaj Yadav 13 Июл 2017 в 09:34

Если вы хотите отображать вид предупреждений для second viewcontroller из firstview controller при переходе к нему, вы можете сделать что-то вроде,

  self.performSegueWithIdentifier("your segue identifier", sender: self)  // or whatever way if you are not using storyboard or segue

    let alert = UIAlertView(title: "Working!", message: "This function was called from FirstViewController!", delegate: nil, cancelButtonTitle: "Okay")
    alert.show()

Если вы хотите установить любой variables из secondviewcontroller, вам необходимо реализовать метод prepareForSegue. (если вы используете переход).

Во-вторых, вы также можете отображать оповещения в viewDidload из secondViewController.

0
Ketan Parmar 5 Сен 2016 в 10:42

РЕДАКТИРОВАТЬ: эти функции были пересмотрены в Swift 3 следующим образом:

Код в FirstViewController

 override function viewDidLoad(){
NotificationCenter.default.addObserver(self, selector: #selector(showAlert), name: NSNotification.Name(rawValue: "showAlert"), object: nil)
}

Код в SecondViewController:

@IBAction func callFunctionInOtherClass(sender: AnyObject) {
 NotificationCenter.default.post(name: NSNotification.Name(rawValue: "showAlert"), object: nil)
}
2
Ketan Dubey 12 Июл 2017 в 16:05

Попробуй это:

SecondViewController().showAlert(self)

В вашем втором контроллере представления

 if let text = textField?.text {
     dispatch_async(dispatch_get_main_queue(),{

      let alert = UIAlertView(title: "Working!", message: "This function was called from FirstViewController!\nTextField says: \(text)", delegate: nil, cancelButtonTitle: "Okay")
      alert.show()

    })
}
0
Khalil Khalaf 13 Сен 2016 в 15:14