ModalViewController内にあるchangeButton(UIButton)をタップすると
クラッシュし、コンソールに
Could not cast value of type UITabBarController to HomeViewController(UIViewController)と表示されます。
遷移は
UITabBarController ↓ FirstViewController(UITableViewController) ※UITabBarController1タブ目のビューです ↓ HomeViewController(UIViewController) ↓ ModalViewController(UIViewController)
の順です。
クラッシュの原因は
コード内でUITabBarControllerとHomeViewControllerが繋がっていない=キャストできないからと思っていますが、キャスト方法がわからない為質問します。
見て頂けないでしょうか?
よろしくお願いします。
import UIKit class CustomTabBarController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() self.navigationItem.hidesBackButton = true // 1 let firestoreController = FirestoreController() firestoreController.navigationItem.title = "タブ1" let firstNavigationController = UINavigationController(rootViewController: firestoreController) firstNavigationController.title = "" firstNavigationController.tabBarItem.image = UIImage(named: "a") viewControllers = [firstNavigationController] tabBar.isTranslucent = false } }
import UIKit class FirestoreController: UITableViewController { private var aButton: UIBarButtonItem! override func viewDidLoad() { self.navigationItem.hidesBackButton = true aButton = UIBarButtonItem(title: "ホーム", style: .plain, target: self, action: #selector(aaa)) self.navigationItem.leftBarButtonItem = aButton } @objc func aaa(_ sender: AnyObject) { let vc = HomeViewController() navigationController?.pushViewController(vc, animated: true) } }
import UIKit class HomeViewController: UIViewController { var textFromModal = "" { didSet { updatelabel(text: textFromModal) } } var textLabel = UILabel() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white set() } func set() { textLabel = UILabel(frame: CGRect(x: 0, y: 0, width: view.bounds.width - 20, height: 30)) textLabel.center = CGPoint(x: view.center.x, y: view.center.y - 50) textLabel.textAlignment = .center textLabel.text = "" view.addSubview(textLabel) // let modalButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 30)) modalButton.center = view.center modalButton.setTitle("開く", for: .normal) modalButton.setTitleColor(UIColor.blue, for: .normal) modalButton.addTarget(self, action: #selector(pushModal(sender:)), for: .touchUpInside) view.addSubview(modalButton) } @objc func pushModal(sender:UIButton) { let modal = ModalViewController(nibName: nil, bundle: nil) modal.modalTransitionStyle = .crossDissolve present(modal, animated: true, completion: nil) } func updatelabel(text: String) { textLabel.text = "a, (text)" } }
import UIKit class ModalViewController: UIViewController, UITextFieldDelegate { var changeButton = UIButton() var textField = UITextField() override func viewDidLoad() { super.viewDidLoad() // view.backgroundColor = .gray let cancelButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 30)) cancelButton.center = CGPoint(x: view.center.x - 100, y: view.center.y) cancelButton.setTitle("キャンセル", for: .normal) cancelButton.setTitleColor(UIColor.black, for: .normal) cancelButton.addTarget(self, action: #selector(pushDismiss(sender:)), for: .touchUpInside) view.addSubview(cancelButton) // changeButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 30)) changeButton.center = CGPoint(x: view.center.x + 100, y: view.center.y) changeButton.setTitle("変更", for: .normal) changeButton.setTitleColor(UIColor.black, for: .normal) changeButton.addTarget(self, action: #selector(pushChange(sender:)), for: .touchUpInside) changeButton.isEnabled = false view.addSubview(changeButton) textField = UITextField(frame: CGRect(x: 0, y: 0, width: view.bounds.width - 20, height: 30)) textField.center = CGPoint(x: view.center.x, y: view.center.y + 50) textField.delegate = self textField.text = "" textField.backgroundColor = .white view.addSubview(textField) let center = NotificationCenter.default center.addObserver(省略してます) } @objc func textFieldDidChange(notification: NSNotification) { if textField.text == "" { changeButton.isEnabled = false } else { changeButton.isEnabled = true } } func textFieldShouldReturn(_ textField: UITextField) -> Bool { self.textField.delegate = self textField.resignFirstResponder() return true } @objc func pushChange(sender:UIButton) { textField.resignFirstResponder() let originVc = presentingViewController as! HomeViewController originVc.textFromModal = textField.text! self.dismiss(animated: true, completion: nil) } @objc func pushDismiss(sender:UIButton) { self.dismiss(animated: true, completion: nil) } }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/06/25 03:02
退会済みユーザー
2018/07/04 04:21
2018/07/04 05:17
退会済みユーザー
2018/07/04 06:10