我有一个通过子类化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的实例。
答案 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
值设置为UITextField
和tag
(1
很可能已经使用过),然后从您的2
获取视图:
0
当然,请确保ViewController
扩展let B = self.view.viewWithTag(1) as? UITextField
let C = self.view.viewWithTag(2) as? UITextField
,即:
ViewController