2016-11-04 2 views
0

Я пытаюсь отобразить кнопку на MainViewController и UITextField в ExternalViewController, когда устройство подключено через HDMI. Когда в MainViewController появляется клик, мне нужно обновить UITextField в ExternalViewController. Я вижу, что отпечатки появляются в окне вывода, но текстовое поле не обновляется.Обновление UITextField в контроллере внешнего вида после щелчка в главном контроллере представления

MainViewController.swift

import UIKit 
import WebKit 

class MainViewController: UIViewController { 
    fileprivate var externalWindow: UIWindow? 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
    if UIScreen.screens.count > 1 { 
     setupExternalScreen(UIScreen.screens[1]) 
    } 

    let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50)) 
    button.backgroundColor = UIColor.blue 

    button.setTitle("Click Me", for: UIControlState.normal) 
    button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside) 

    self.view.addSubview(button) 

    } 

    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 


    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
    } 
    */ 
    fileprivate func setupExternalScreen(_ screen: UIScreen) { 
    guard externalWindow == nil, 
     let vc = self.storyboard?.instantiateViewController(withIdentifier: "ExternalScreen") as? ExternalViewController else { 
     return 
    } 

    externalWindow = UIWindow(frame: screen.bounds) 
    externalWindow!.rootViewController = vc 
    externalWindow!.screen = screen 
    externalWindow!.isHidden = false 
    } 

    func buttonAction(sender: UIButton) { 
    print("Button tapped") 
    ExternalViewController().updateLabel() 
    } 

} 

ExternalViewController.swift

import UIKit 

class ExternalViewController: UIViewController { 

    let output = UITextField(frame: CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: 300, height: 100))) 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.addTextField() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func addTextField() { 
     output.textColor = UIColor.black 
     output.text = "This is the other text field" 
     view.addSubview(output) 
    } 

    func updateLabel() { 
     print("inside updateLabel") 
     output.text = "button was clicked" 
    } 

} 

Вот как это выглядит.

enter image description here

Это мой первый проект с Swift, поэтому я прошу прощения, если это плохой вопрос.

+1

вам нужно передать данные в виде строки или с помощью делегата. – KKRocks

+0

Проверьте мой ответ. Если вы находитесь в iOS, вам следует подумать о том, чтобы представить ExternalViewController вместо того, чтобы показывать его в новом окне, что, по меньшей мере, – DatForis

ответ

1

Попробуйте использовать NotificationCentre. В ExternalVC

override func viewDidLoad() { 
    super.viewDidLoad() 
    NotificationCenter.default.addObserver(self, selector: #selector(receivedDataFromNotification(notification:)), name: NSNotification.Name(rawValue: "passdata"), object: nil) 
    } 

    func receivedDataFromNotification(notification : NSNotification) -> Void { 
     print(notification.object); 
     output.text = "button was clicked" 
    } 

В MainViewController

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "passdata"), object: "your string pass here") 
0

В то время как вы можете использовать уведомление для передачи данных между Я предпочитаю создавать делегат для передачи данных. сначала создать протокол

protocol ExternalViewControllerDelegate: class{ 
    func shouldUpdateLabel(withText text: String) 
} 

Затем обновите ExternalViewController надлежащим образом содержать делегат, который слабая ссылка конечно

class ExternalViewController: UIViewController { 
    weak var delegate: ExternalViewControllerDelegate? 
    let output = UITextField(frame: CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: 300, height: 100))) 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.addTextField() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func addTextField() { 
     output.textColor = UIColor.black 
     output.text = "This is the other text field" 
     view.addSubview(output) 
    } 

    func updateLabel() { 
     print("inside updateLabel") 
     output.text = "button was clicked" 
     delegate?.shouldUpdateLabel(withText: "Your text") 
    } 
} 

Запомнить вызвать метод в делегатом. Я использовал метод updateLabel в классе для вызова метода. Который я предполагаю, что вы также хотите использовать

Наконец, выполните протокол в MainViewController и не забудьте установить делегат.

extension MainViewController: ExternalViewControllerDelegate{ 
    func shouldUpdateLabel(withText text: String) { 
     //Do what you want with the text 
    } 
} 

Затем обновите метод setupExternalScreen установить делегат

func setupExternalScreen(_ screen: UIScreen) { 
    guard externalWindow == nil, 
     let vc = self.storyboard?.instantiateViewController(withIdentifier: "ExternalScreen") as? ExternalViewController else { 
      return 
    } 
    vc.delegate = self 

    externalWindow = UIWindow(frame: screen.bounds) 
    externalWindow!.rootViewController = vc 
    externalWindow!.screen = screen 
    externalWindow!.isHidden = false 
} 
Смежные вопросы