SubView单击项目以在父视图标签

时间:2015-07-01 16:14:19

标签: ios swift

我想创建一个具有标签,表格视图和一键式按钮的UI。单击按钮时,我们会弹出一个包含大量按钮的半屏视图。我希望用户仍然可以点击屏幕的其余部分。

所以我使用帖子中建议的方法 How To Present Half Screen Modal View?

方法2:为UIView设置动画,其大小为现有视图的一半。            然后你必须简单地遵循UIView的动画。 这里只是一个将作为子视图添加到现有视图的UIView,您将能够触摸屏幕的其余部分。

由于我是ios和swift的新手,我想得到一些建议。 现在我成功添加为子视图并在屏幕的一半显示。

如何实现让子视图标签文本上的子视图单击按钮结果显示?

我在考虑parent.xib和subview.xib有相同的UIVeiwController.swift。然后我可以@IBOutlet和@IBAction到同一个控制器swift文件并更新结果。但不知道这是可以接受的方式吗?

如果没有,subViewController如何将结果/事件发送到父视图并在父视图组件中更新?

1 个答案:

答案 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!" )
    }
}