我想创建一个具有标签,表格视图和一键式按钮的UI。单击按钮时,我们会弹出一个包含大量按钮的半屏视图。我希望用户仍然可以点击屏幕的其余部分。
所以我使用帖子中建议的方法 How To Present Half Screen Modal View?
方法2:为UIView设置动画,其大小为现有视图的一半。 然后你必须简单地遵循UIView的动画。 这里只是一个将作为子视图添加到现有视图的UIView,您将能够触摸屏幕的其余部分。
由于我是ios和swift的新手,我想得到一些建议。 现在我成功添加为子视图并在屏幕的一半显示。
如何实现让子视图标签文本上的子视图单击按钮结果显示?
我在考虑parent.xib和subview.xib有相同的UIVeiwController.swift。然后我可以@IBOutlet和@IBAction到同一个控制器swift文件并更新结果。但不知道这是可以接受的方式吗?
如果没有,subViewController如何将结果/事件发送到父视图并在父视图组件中更新?
答案 0 :(得分:1)
你可以使用委托。这样可以使视图控制器解耦,即防止子视图对其父视图的引用,这允许其他视图控制器以相同的方式与模态视图控制器交互。
class ParentViewController : UIViewController, ModalViewControllerDelegate {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let modalViewContorller = ModalViewController()
modalViewContorller.delegate = self
self.presentViewController( modalViewContorller, animated: true, completion: nil )
}
func modalViewControllerDidProduceResult( modalViewController: ModalViewController, result: String ) {
self.label.text = result
}
}
protocol ModalViewControllerDelegate {
func modalViewControllerDidProduceResult( modalViewController: ModalViewController, result: String )
}
class ModalViewController: UIViewController {
var delegate: ModalViewControllerDelegate?
@IBAction func buttonClicked( sender: AnyObject? ) {
delegate?.modalViewControllerDidProduceResult( self, result: "Hello!" )
}
}
你也可以使用一个闭包,它在Swift中提供了更简洁的语法。
class ParentViewController : UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let modalViewContorller = ModalViewController()
self.presentViewController( modalViewContorller, animated: true, completion: nil )
modalViewContorller.resultBlock = { (result: String) in
self.label.text = result
}
}
}
class ModalViewController: UIViewController {
var resultBlock: ((String) -> ())?
@IBAction func buttonClicked( sender: AnyObject? ) {
self.resultBlock?( "Hello!" )
}
}