私はViewController
別にView
コード(see this)を維持し、これもUIAlertController.
なぜこのUIAlertControllerはオプションの値をアンラップしている間にnilを見つけられないのですか?
しかし、アップルのドキュメントsays用のコードに適用できる場合、私は思ったんだけどにより「は善良な市民こと」しようとしています:
UIAlertControllerクラスは、そのまま使用することを目的としており、サブクラス化をサポートしていません。このクラスのビュー階層はプライベートであり、変更することはできません。これにもかかわらず
、私はまだUIAlertController
をサブクラス化することは可能かもしれないと思った - はい、私はUIAlertController
がView
ではないことを実感 - 私はの下に簡単なテスト例を試してみました。
コードには、レイアウトの制約があるサブクラス化されたビューが含まれています。 A UIButton
がアラートをアクティブにするために使用されます(そして、最終的にターゲットアクションは別のクラスから呼び出すことができる関数の基礎になります)。
コードが実行されますが、できるだけ早くボタンが押されているXcodeのは次の行
fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)
は私がミスをしてきたメッセージと
self.view.present(alert, animated: true, completion: nil)
でデバッグに入りますか?私は何か不可能なことをしようとしていますか?
ViewController.swift
import UIKit
class ViewController: UIViewController {
var launch: TestView {
return view as! TestView
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func loadView() {
let contentView = TestView(frame: .zero)
view = contentView
}
}
TestView.swift
import UIKit
class TestView: UIView {
var view:ViewController!
override init(frame: CGRect) {
super.init(frame: frame)
view.self = view
addBehavior()
}
convenience init() {
self.init(frame: CGRect.zero)
}
required init(coder aDecoder: NSCoder) {
fatalError("This class does not support NSCoding")
}
func addBehavior() {
let spacer: UIView = UIView (frame: .zero)
spacer.backgroundColor = UIColor.white
let view: UIView = UIView (frame: .zero)
view.backgroundColor = UIColor.lightGray
view.alpha = 0.5
let button: UIButton = UIButton(frame: .zero)
button.backgroundColor = UIColor.blue
button.setTitleColor(UIColor.white, for: UIControlState.normal)
button.setTitle("test", for: .normal)
button.addTarget(self, action: #selector(showExcessNotesAlert), for: .touchUpInside)
let stackView = UIStackView(arrangedSubviews: [spacer, view, button])
stackView.axis = .vertical
stackView.spacing = 5
stackView.translatesAutoresizingMaskIntoConstraints = false
addSubview(stackView)
let views = ["stackView": stackView]
var layoutConstraints = [NSLayoutConstraint]()
layoutConstraints += NSLayoutConstraint.constraints(withVisualFormat: "|-[stackView]-|", options: [], metrics: nil, views: views)
layoutConstraints.append(spacer.heightAnchor.constraint(equalToConstant: 30))
layoutConstraints.append(view.heightAnchor.constraint(equalToConstant: 450))
layoutConstraints.append(button.heightAnchor.constraint(equalToConstant: 50))
NSLayoutConstraint.activate(layoutConstraints)
backgroundColor = .white
}
func showExcessNotesAlert(_ sender: UIButton) {
let alert = UIAlertController(title: "Alert", message: "Grow a brain", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil)
alert.addAction(defaultAction)
self.view.present(alert, animated: true, completion: nil)
}
}
あなたはUIViewとUIViewControllerの違いを知っていますか? –
@El Tomato、原則として私はそうだと思いますが、UIViewControllerに表示されるUIViewをサブクラス化することができ、UIAlertControllerと同様のものを実現することができるかどうかについては、 – Greg