如何设置子视图的委托

时间:2018-05-03 15:16:49

标签: ios swift delegates

我有一个通过子类化UIView创建的自定义视图,它有两个UITextView子视图,它们在其init方法中实例化。让我们说清楚事情,我有一个包含两个UITextViews B和C的超级视图A.

另一方面,我有UIViewController VC管理超级视图A,并负责其控制。这意味着它具有控制用户在C上更改文本时会发生什么的方法。

当有人必须控制UITextView时,他通常会执行类似

的操作
textView.delegate = self

我想做同样的事情,但是从VC中看不到C. VC只使用A,所以我有

a.delegate = self

然后我想到了在A:

的实现中这样做的想法
weak var delegate: UITextViewDelegate? {
    get {
        return c.delegate
    }

    set {
        c.delegate = newValue
    }
}

但是这给了我一个错误,说它解开了一个实际值为零的可选值。

那么,什么是从VC控制UITextView C(在UIView A内部)的正确方法,它只有一个A的实例。

2 个答案:

答案 0 :(得分:0)

很可能c可能是零。要解决此问题,您需要在c初始化后设置委托。

或者,创建自己的代理 - ADelegate!这样,您可以使用更有意义的名称命名自己的委托方法!

protocol ADelegate : class {
    func cDidChange()
}

A

weak var delegate: ADelegate?

现在A应该实现UITextViewDelegate,将c.delegate设置为self,并将方法转发给self.delegate

答案 1 :(得分:0)

如果您在Xcode Interface Builder中添加了File "/anaconda3/lib/python3.6/site-packages/PyInstaller/hooks/hook-sysconfig.py", line 42, in <module> hiddenimports = [sysconfig._get_sysconfigdata_name()] TypeError: _get_sysconfigdata_name() missing 1 required positional argument: 'check_exists',则可以为UITextField中的文本字段创建出口(即使文本字段是视图的子子项, viewcontroller控制)。

因此,继续使用您的命名,您可以在ViewController

添加以下商店
ViewController

并在@IBOutlet weak var B: UITextField! @IBOutlet weak var C: UITextField! 的{​​{1}}添加:

ViewController

如果您以编程方式创建viewDidLoad(),则可以将其B.delegate = self C.delegate = self 值设置为UITextFieldtag1很可能已经使用过),然后从您的2获取视图:

0

当然,请确保ViewController扩展let B = self.view.viewWithTag(1) as? UITextField let C = self.view.viewWithTag(2) as? UITextField ,即:

ViewController
相关问题