Objective c 截取/以编程方式设置IBOutlet属性
问题: 是否有任何方法可以通过编程和自动方式设置IBOutlet属性(即不必对要设置的属性进行硬编码)?也许有一些“IBOutlet设置”例程,我可以用自己的专用代码截取 背景: 导致上述问题的问题源于这样一个事实,即在运行以下方法时没有设置“IBOutleted”大小约束(宽度和高度)(这是一种将IB中的“占位符”视图替换为真实视图的方法): 使用coder:(NSCoder*)编码器后,从UIView::awakeAfter调用此方法。它已经用许多不同的笔尖进行了测试,到目前为止工作得非常好。但现在的问题是,我必须重新创建那些严格与被替换视图相关的约束,即宽度和高度(与superview相关的约束将无缝传输)。对于一个这样的约束,我有一个IBOutlet,在使用此方法时它仍然为零 为了澄清,守则:Objective c 截取/以编程方式设置IBOutlet属性,objective-c,constraints,nib,objective-c-runtime,Objective C,Constraints,Nib,Objective C Runtime,问题: 是否有任何方法可以通过编程和自动方式设置IBOutlet属性(即不必对要设置的属性进行硬编码)?也许有一些“IBOutlet设置”例程,我可以用自己的专用代码截取 背景: 导致上述问题的问题源于这样一个事实,即在运行以下方法时没有设置“IBOutleted”大小约束(宽度和高度)(这是一种将IB中的“占位符”视图替换为真实视图的方法): 使用coder:(NSCoder*)编码器后,从UIView::awakeAfter调用此方法。它已经用许多不同的笔尖进行了测试,到目前为止工作得非常好
[replacer addConstraint:constraintClone];
工作正常,将添加并应用约束。但是,未设置相应的IBOutlet(保持为零)
更新:
Sashas的回答是正确的,但拦截IBOutlet任务的方法并没有解决我的问题
正如萨沙指出的,我的背景部分相当不清楚。因此,我将快速尝试用另一种方式解释它
我使用Nib文件来存储或多或少复杂的视图。为了无缝地将它们插入故事板或其他nib文件中,我实现了一个“nibloaddedview”类,它基本上用复杂视图替换来自initWithCoder的任何实例。换句话说,我可以在storyboard/IB中设置简单占位符UIView的自定义类型,当应用程序运行时,它将加载真实/复杂视图。应用于该占位符视图的所有约束都应该移动到真实视图。他们做到了,至少所有的约束都表达了占位符与其周围环境(其他视图)之间的关系。另一方面,尺寸约束存储在占位符视图中,如果不传输到真实视图,则会丢失。我遇到的问题就是这个传输,因为一旦我复制了约束,它们就会按预期应用,但是如果我引用其中一个作为IBOutlet,那么IBOutlet将变为零(它指向与占位符视图相关的约束,一旦该视图及其所有约束被删除,弱的IBOutlet变为nil;强的IBOutlet也不会改变任何东西,它只会持有错误的约束而不是nil)
解决办法是取代:
[replacer addConstraint:constraintClone];
与:
这将使用constraintClone在内存中的位置覆盖约束,以这种方式隐式更新IBOutlet,无论其设置在何处,以何种方式设置。
IBOutlet
s通过KVC设置:当对情节提要或nib进行解码时,它将为所有插座(操作、插座集合)调用setValue:forKey:
。如果出于某种原因,您想干扰此过程,请重写它,并在键
正确时使用自定义逻辑
也许你想了解一下从nib唤醒的方法,因为这是nib被完全解码并且所有出口都设置好的第一种方法。老实说,我并不真正理解这个目标,也许你可以再解释一下。
IBOutlet
是通过KVC设置的:当故事板或nib被解码时,它调用设置值:for键:
用于所有门店(操作、门店集合)。如果出于某种原因,您想干扰此过程,请覆盖它,并在Key
正确时使用自定义逻辑
也许你想研究一下
awakeFromNib
——因为这是nib完全解码并设置所有输出口的第一种方法。老实说,我并不真正理解这个目标,也许你可以再解释一下。你太聪明了。用memcpy
覆盖一个对象的内存充其量也有风险写一个不透明的对象更糟糕。你这样做可能会导致泄漏、弱引用出错等等,而这正是好的一天
说真的,不要这样做。
如果我正确理解了您的问题,您有(a)占位符视图和(b)引用占位符视图上约束的IBOutlet
。您希望(1)替换占位符视图和(2)更新IBOutlet
以引用替换视图上的约束。并且您正在放置您不想知道引用您的约束的任何IBOutlet的位置的进一步约束
想想一般意义上的间接性
可以沿以下直线构造模型:
- 创建管理对约束的引用的控制器对象
- 向引用其控制器对象的占位符视图添加属性
- 将控制器管理的初始约束设置为占位符
- 将所有IBOutlet指向控制器而不是对象的约束
- 当您使用另一个视图替换占位符(使用其到控制器对象的链接)时,将更新所引用的约束
NSObjectController
存在以支持的那种模型
请勿阅读此内容
如果你真的想射中你自己和你的用户的脚,不要认为覆盖,想想交换,当然还是很危险的。说够了。你太聪明了。用
memcpy
覆盖一个对象的内存充其量是有风险的,覆盖一个不透明的对象更糟糕。你这样做可能会导致泄漏,weak引用出错,等等,这就是j
[replacer addConstraint:constraintClone];
memcpy((__bridge void*)constraint, (__bridge const void*)constraintClone, malloc_size((__bridge const void *)constraint));
[replacer addConstraint:constraint];