UIScrollView由UIViewController的“view”属性和插座引用

时间:2011-11-05 04:16:48

标签: iphone objective-c uiscrollview iboutlet

我即将在我的iPhone项目中添加UIScrollView,在实施此功能之前,我想检查一下我的方法是否合适,或者我是否违反了一些我不了解的最佳做法的。

我看到的教程通常涉及向现有UIScrollView添加UIView,并且可以从那里开始工作。但是,我想知道我是否可以完全放弃UIView并将UIScrollView添加为我的nib文件中唯一的顶级对象。

我的示例项目使用Xcode的基于视图的应用程序模板:
Project navigator http://img542.imageshack.us/img542/5364/projectnavigator.png

我从原始UIView文件中删除了MySampleViewController.xib顶级对象,并通过添加UIScrollView对象将其替换为:
Nib placeholders http://img526.imageshack.us/img526/7709/placeholderobjects.png

现在我的nib文件只在画布中显示这个对象:
Canvas http://img233.imageshack.us/img233/4063/scrollview.png

然后我创建了从UIViewController的{​​{1}}出口到view的链接。

现在,如果我想以编程方式操作UIScrollView的内容,我可以使用以下代码:

UIScrollView

为了实现解决方案A,滚动条插座也必须链接到笔尖的UIScrollView,并且Connections Inspector如下所示:
Connections Inspector http://img228.imageshack.us/img228/8397/connectionsj.png


解决方案A 需要一个插座,这意味着与- (void)viewDidLoad { [super viewDidLoad]; NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil]; // Solution B: With the following line we avoid creating an extra outlet linking to the UIScrollView top-level object in the nib file UIScrollView *scrollView = (UIScrollView *)self.view; for (int i = 0; i < colors.count; i++) { CGRect frame; //frame.origin.x = self.scroller.frame.size.width * i; // Solution A: scroller is an IBOutlet UIScrollView *scroller; frame.origin.x = scrollView.frame.size.width * i; // Solution B frame.origin.y = 0; //frame.size = self.scroller.frame.size; // Solution A frame.size = scrollView.frame.size; // Solution B UIView *subView = [[UIView alloc] initWithFrame:frame]; subView.backgroundColor = [colors objectAtIndex:i]; //[self.scroller addSubview:subView]; // Solution A [self.view addSubview:subView]; // Solution B [subView release]; } //self.scroller.contentSize = CGSizeMake(self.scroller.frame.size.width * colors.count, self.scroller.frame.size.height); // Solution A scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * colors.count, scrollView.frame.size.height); // Solution B } 有两个连接:UIScrollView自己的UIViewController插座和viewMySampleViewController出口。是否合法和/或建议有两个出口指向同一视图?

解决方案B 只涉及链接到该视图的scrollerUIViewController个点,并使用以下行:

view

我的问题:

  1. 使用这两种解决方案中的一种,是否会导致某些违反Apple设计指南的行为?
  2. 我应该在UIView解决方案中坚持使用UIScrollView吗?
  3. 还有其他方法可以实现吗?
  4. 谢谢!

    P.S。很抱歉语法高亮,SO无法识别'objective-c'标签的使用

1 个答案:

答案 0 :(得分:4)

  1. 不,我认为你没办法。

  2. 我愿意,我认为UIView没有任何重大成本,加上你想要添加页面控件的内容是什么?并且您不必在每次需要时将控制器的视图转换为UIScrollView。

  3. 看起来你已经控制了我。

  4.   

    解决方案A需要一个插座,这意味着有两个连接到UIScrollView:UIViewController自己的视图插座和MySampleViewController的滚动插座。是否合法和/或建议有两个出口指向同一视图?

    将IBOutlet设置为您想要直接从视图控制器访问的.nib中定义的任何视图。

    如果你不想要两个出口,你可以给滚动视图一个标签然后找到它:

    UIScrollView *myScrollView = (UIScrollView *)[self.view viewWithTag:1]
    

    然后你只将视图作为插座,但我只想添加额外的插座。只需确保在viewDidUnload中将它们设置为nil。

    此外,您不必保留滚动视图(如果您仍然使用保留/释放)。由于滚动视图位于视图控制器的视图中,因此它保留了一个引用,因此如果使用ARC,则可以通过assign或week来获取scrollview的属性。

    希望有所帮助。