2013-02-17 84 views
9

使用Xcode 4.3.3,我无法弄清楚如何将自定义UIView类中的插座与Interface Builder中创建的对象连接起来。Interface Builder将不允许连接到自定义UIView类?

在一个ViewController中,我有各种各样的按钮,滑块等,我试图分组到视图。所以,在IB的ViewController中,我添加了3个视图。在任何给定时间只有1个视图可见。

我派生了自定义的UIView类来处理这3个视图中的每一个。我的视图控制器实例化每个类。我选择了IB中的视图,打开了Identity Inspector并将Class设置为我的自定义类(es)。但是,当我试图从视图拖动连接和/或它的组成控件到自定义视图的.h文件时,IB不会添加连接。

IB允许我通过拖动到父视图控制器的.h而不是自定义视图的.h文件来添加插座/操作。我曾经想过,一旦将View的类设置为我的自定义类,我可以将视图组件的插口拖到我的自定义类中,而不是在视图控制器中。

这个问题似乎与我的相同:how to connect UIview outlets to a custom subview这两个解决方案(手动添加插座并在IB中设置视图的类)并没有改变我的行为。这里有手动网点我说:

customView3.h

#import <UIKit/UIKit.h> 

@interface customView3 : UIView 

@property (retain) IBOutlet customView3 *view3; 
@property (retain) IBOutlet UISlider *slider; 

@end 

customView3.m

#import "customView3.h" 

@implementation customView3 

@synthesize view3, slider; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
    // Initialization code 
    } 
    return self; 
} 
@end 

缺少什么我在这里?我还需要设置/检查以将网点添加到我的自定义UIView而不是视图控制器?

+0

膨胀。所以,我当然可以定义创建控件,手动说滑块,并将其放在我想要的位置。但是,如何以编程方式将动作(如Value Changed)设置为我的自定义类中的函数?我会设置slider.delegate = myCustomView? – Thunk 2013-02-17 07:40:39

+0

老实说,我不知道。我讨厌Interface Builder,我很少使用它。要以编程方式添加动作,请使用'UIControl'的addTarget:action:forControlEvents方法。 – 2013-02-17 07:50:44

+0

为什么不直接用'self'而不是IBOutlet来使用* view3? – 2013-02-17 22:07:10

回答

15

请注意,我确实得到了今天的工作,但必须在派生类中手工插入/输入插座,然后我可以从头文件拖动到故事板中的UI元素,而不是其他方式周围。

+0

这应该是一个被认可的答案。实际上,当你在.h/.m中创建一个Outlet/Action原型,并且将连接从原型拖拽到IB元素时,至少可以创建一个连接。 – 2014-10-14 14:51:44

+0

这适用于我。在文件中输入IBOutlet,然后从文件拖到故事板,而不是其他方式。 – SimplGy 2015-03-09 11:45:34

+0

完美地工作。不知道为什么它不能以其他方式工作,这使得该过程与直觉相反。 – 2017-08-08 10:29:41

0

根据我的经验,您将IBAction和IBOutlet添加到UIViewController的子类而不是UIView的子类。因此,在MVC模型中,您的“1”UIViewController具有所有这些IBOutlets,然后使用这些IBOutlets中的数据更新您的视图。

所以你很好地创建IB中的UIViews对象,然后在代码中创建相应的类,然后将IB中的UIViews对象的类更改为您的UIView子类。只需将所有IBOutlets放在UIViewController中,该UIViewController下面有所有的UIViews,从IBOutlets中获取所需的值,然后将它们传递给(设置它们)您的UIView子类。

希望这会有所帮助。

+1

好吧,我的目标并不是在一个巨型视图控制器中拥有如此多对象的所有代码。这就是我想要做的。我想将处理程序分散到不同的类中(不必是UIView类,但这似乎是与IB最为合理的配对),并按照与这些控件相关的任务进行分组。 – Thunk 2013-02-17 19:39:22

2

我打开了一个苹果的错误。如果发生任何有趣的事情,我会更新这个答案。

更新于10/4/13:经过大量研究,似乎问题的根源在于,IB认为我试图将对象连接到类中的属性,然后创建一个群这个类的实例,然后IB将无法知道哪个实例应该处理这些消息。所以,它不允许连接,因为我相信(可能)在类的几个实例上同时连接一个对象到一个属性的多个副本。

我的观点是我只想要一个自定义UIView的实例,并且我应该能够告诉IB,“不要惊慌,你只处理这个实例。”

我现在专注于一个新项目,并没有机会在Xcode 5中重试这个;不过,考虑到上面的信息,我不太乐观,它也可以在Xcode 5中工作。

1

你想要做的事当然是明智的(IMO)和可能的。然而,XCode在子视图中建立连接到网点时非常古怪。

我发现清理,重建和有时重新启动XCode会帮助,但有时它不起作用。在某些情况下,我通过手动创建插座并将其从插座拖到控件而不是其他方式工作。

这是不是非常有帮助,我知道,但我只想说清楚,这是应该工作,当它没有它肯定是由于XCode中的错误。

0

我有同样的问题,并找到解决方法:

1)打开助理编辑与customView3.xib左侧和customView3.h右边的

2)按Ctrl +拖动从UISlider customView3.xib到右侧的customView3.h代码

3)创建一个新的Outlet连接的选项将弹出。

4)命名连接,然后单击连接

然后它会创建一个连接IBOutlet中。

相关问题