У меня есть два 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 .: Конечно, я мог бы опубликовать код и объяснить, какую ошибку я получаю, но я думаю, что это неразумно, потому что я действительно не знаю, как это сделать.
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
.
Если вы хотите отображать вид предупреждений для 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
.
РЕДАКТИРОВАТЬ: эти функции были пересмотрены в 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)
}
Попробуй это:
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()
})
}
Похожие вопросы
Связанные вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.