2016-09-05 3 views
0

У меня есть два ViewControllers, FirstViewController и SecondViewController. Оба имеют собственный файл Swift, FirstViewController.swift и SecondViewController.swift.Функция вызова от другого ViewController

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

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

+0

Зачем вам это нужно? Является ли это точным прецедентом (т. Е. Показывая предупреждение)? Если нет, каков фактический прецедент? – Losiowaty

+0

Не выделяя secondviewcontroller, как вы можете вызвать метод showAlert() из firstviewcontroller? – Poles

+0

использование или уведомление –

ответ

5

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

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

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

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

@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 в метод viewDidUnload SecondViewController.

+0

Большое спасибо, что работает и спас меня. Но еще два вопроса: '1.' Что вы имеете в виду с последним предложением? Что это делает? '2.' Почему вы единственный, кто предложил это решение? Это необычный способ? Потому что это кажется очень легким. Мне интересно, почему у другой не было этой идеи. – David

+0

Шобхакар Тивари также предложил стандартные способы реализации механизма действия цели. Но ваш указанный случай не может быть обработан делегатами, оставив только один параметр, например, NotificationCentre. и в соответствии с документацией на яблоко: обязательно вызовите этот метод (или удалитеObserver :) перед объектом наблюдателя или любым объектом, указанным в addObserver: selector: name: object: deallocated. Потому что это может привести к сбою вашего приложения, когда уведомление вызывается на nil observer. – iOSGeek

+0

У него также есть последствия утечки памяти. – iOSGeek

0

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

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

Я получаю «фатальную ошибку: неожиданно нашел нуль при распаковке необязательного значения», и он сработает. Но при удалении кода предупреждения и просто 'print (« It works! »)' Нет сбоя, и я получаю отпечаток в консоли. – David

+0

'\ (textField.text!)', Кажется, проблема. При его удалении он работает с и без 'dispatch_async'. Любые идеи, что делать? – David

+0

Пожалуйста, не разворачивайте, как this.it это неправильно. – Sofeda

0

вид Если вы хотите, чтобы показать предупреждение вид 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. (если вы используете segue).

Вторая вещь, которую вы можете показать alertview в viewDidload от secondViewController также.

+0

К сожалению, это не сработает. Мне нужно, чтобы эта функция выполняла его 'SecondViewController', потому что мне понадобится' @ IBOutlet', потому что это 'ViewController'. – David

1

EDIT: These functions have been revised in swift 3 as follows:

Код в 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) 
} 
Смежные вопросы