以编程方式访问UIScrollView的子视图

时间:2014-10-20 19:23:49

标签: ios objective-c xcode uiview uiscrollview

在View Controller中我添加了一个UIScrollView,然后在滚动条中添加了一个UIView。我通过Storyboard在UIView中放置了几个按钮,我想以编程方式有条件地添加其他按钮。

我尝试将以下引用链接到Storyboard中的UIScrollView和UIView,但是当加载此视图控制器时,任一链接都会导致应用程序崩溃:

@property (strong, nonatomic) IBOutlet UIScrollView *scroll;
@property (strong, nonatomic) IBOutlet UIView *v;

由于我无法在Storyboard中创建引用插座,如何创建对UIView的引用以便我可以添加我的按钮?

当应用程序崩溃时,主方法返回行以绿色突出显示,并显示消息Thread1:signal SIGABRT 在输出窗口中,根据链接的上述属性,我看到:

  

2014-10-20 12:42:26.411 Testbed [2451:283149] ***由于未捕获的异常'NSUnknownKeyException'终止应用程序,原因:'[setValue:forUndefinedKey:]:此类不是键值编码 - 符合键滚动。'

或:

  

2014-10-20 12:52:06.986 MTH [2578:299917] ***由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[setValue:forUndefinedKey:]:此类不是键值编码 - 符合密钥v。'

4 个答案:

答案 0 :(得分:3)

添加像这样的子视图

[self.v addSubview:button];

像这样访问子视图

UIScrollView *scrollview = (UIScrollView *) _scroll;
UIView *View = (UIView *) scrollview.subviews[0];

答案 1 :(得分:1)

我找到了答案。在我的视图控制器的自定义类的ViewDidLoad方法中,我使用了以下内容:

NSArray *sv = self.view.subviews;
UIScrollView *sc = sv[0];
sv = sc.subviews;
UIView *v = sv[0];

我逐步完成执行以确认ScrollView是视图的第一个子视图,并确认UIView是ScrollView的第一个子视图。

如果我需要在ViewDidLoad方法之外访问此视图,我会在头文件中创建变量。

答案 2 :(得分:0)

如果要以编程方式向视图添加子视图,则需要将其实例化并将其添加到subView,如下所示:

UIButton *button = [UIButton new];
[button setTitle:@"BUTTON!" forControlState:UIControlStateNormal];
[button sizeToFit];

// Do any additional setup for your button here, for example setting the frame.
[self.v addSubview:button];

如果这实际上是你想从你的问题中做的话,我无法解决。所以,如果我得到你的错误,请告诉我!

编辑1

道歉,我误解了这个问题。查看您提供的错误,您可能没有在界面构建器的右侧窗格中将视图控制器设置为自定义子类。

可能会发生此错误,因为虽然您已链接IBOutlets,但运行时正在尝试初始化UIViewController的不正确的子类,因此无法找到所需的属性。

答案 3 :(得分:0)

在您的故事板中,您的视图控制器可能不会从您的自定义视图控制器继承,因此无法找到iboutlet(这就是您无法创建链接的原因)。 顺便说一句:iboutlet应该永远不会强大而是弱,因为它们已被控制器保留的视图保留。

相关问题