Objective c 截取/以编程方式设置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调用此方法。它已经用许多不同的笔尖进行了测试,到目前为止工作得非常好

问题:

是否有任何方法可以通过编程和自动方式设置IBOutlet属性(即不必对要设置的属性进行硬编码)?也许有一些“IBOutlet设置”例程,我可以用自己的专用代码截取

背景:

导致上述问题的问题源于这样一个事实,即在运行以下方法时没有设置“IBOutleted”大小约束(宽度和高度)(这是一种将IB中的“占位符”视图替换为真实视图的方法):

使用coder:(NSCoder*)编码器后,从UIView::awakeAfter调用此方法。它已经用许多不同的笔尖进行了测试,到目前为止工作得非常好。但现在的问题是,我必须重新创建那些严格与被替换视图相关的约束,即宽度和高度(与superview相关的约束将无缝传输)。对于一个这样的约束,我有一个IBOutlet,在使用此方法时它仍然为零

为了澄清,守则:

[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];