有没有办法从子视图中获取父对象?

时间:2019-04-08 17:37:49

标签: swift

我正在研究一种填字游戏应用程序,以便快速运行,但在从UIButton的{​​{1}}的{​​{1}}获取subview的过程中遇到麻烦。 / p>

该文本字段占据了UIButton标题应保留的空间,但是在单击textfield时并没有单击UIButton。 到目前为止,textfield本身突出显示了某一列和某行的所有UIButton

我尝试过一些事情,例如刻划子视图的超类

UIButton

我也尝试使用

UIButtons

var myButton: CustomButton = textfield.superclass as? CustomButton

var myObject : CustomButton? {
  return view.compactMap({$0 as? CustomButton }).first
}

我有一个CustomButton.swift,它将所有CustomButtons存储在数组中,因此我可以管理它们并检索某些CustomButtons。

class CustomButton: UIButton { var number: Int = 0 var letter: Character? var textField: UITextField! var cornerLabel: UILabel! // this init will intialize the button through programatically override init(frame: CGRect) { super.init(frame: frame) textField = UITextField(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) textField.translatesAutoresizingMaskIntoConstraints = false textField.center = .zero textField.textAlignment = .center textField.text = "" 具有所有引用CustomButton。我正在使用MainController中的UITextFieldDelegate

ButtonStore.swift

预期的结果是在按下文本字段或抓住按下的文本字段的CustomButton时触发了CustomButton,因此我将CustomButton用作参考。

2 个答案:

答案 0 :(得分:1)

您可以通过{p>获取superview

if let button = textField.superview as? CustomButton {
   // Do what you want to here
}

答案 1 :(得分:1)

您可以通过沿着响应者链(因为UIViewController和UIView都继承自UIResponder并实现其public List<Student> findByStudent_Grades_ClassName(final String className); 方法)以一种类型安全的方式来获取任何超级视图或父视图控制器(通常):

next

使用方式:

extension UIResponder {
    func firstParent<T: UIResponder>(ofType type: T.Type ) -> T? {
        return next as? T ?? next.flatMap { $0.firstParent(ofType: type) }
    }
}

此方法的优点是,即使不是直接父级,也可以找到特定类型的下一个父级(即,在文本字段和CustomButton之间可能有多个视图,并且在调用superview时,它仍然可以工作)不是)。