将 UITextView 添加为 UIView 中的子视图,然后添加到 UIScrollView

Posted

技术标签:

【中文标题】将 UITextView 添加为 UIView 中的子视图,然后添加到 UIScrollView【英文标题】:Adding UITextView as subview in UIView then to UIScrollView 【发布时间】:2009-05-28 17:23:54 【问题描述】:

我有一个连接到 View xib 的 UIViewController (ContentViewController)。我在UIView 上放了一个TextView,它在IB 的层次结构中显示为子视图。ContentViewController 有一个标签作为插座,它连接到ContentView.xib 上的标签。当下面的代码执行时,第一个视图显示文本视图,但滚动其他视图/页面只显示标签。

for(int i=0; i< 5; i++)
  ContentViewController *contentView = [[ContentViewController alloc] initWithNibName:@"ContentView" bundle:[NSBundle mainBundle]]; 
  [contentView loadView];
  contentView.theLabel.text =[NSString stringWithFormat:@"hello again..%d", i];
  [self.scrollView addSubview:contentView.view];

我可以将按钮或文本字段拖到 IB 中的视图上,当我滚动页面时它们都在那里。上面的文字也设置在标签上。 textview 在第一页后消失。我也无法设置它的文本。我已经将一个新的文本视图拖到UIView 上,它在第一页之后也消失了。我需要为 textview 做些什么不同的事情吗?


我发现UIScrollView 在每一页上。如果我在滚动视图所在的位置垂直滑动,则会出现文本。但是我必须对第一个之后的所有滚动视图都这样做。

但是,一旦我滑动它们,文本仍然可见,直到应用程序重新启动。如果没有足够的文本导致滚动,则 textview 将永远不会出现。对此行为有何建议?

【问题讨论】:

【参考方案1】:

试试:

[textView setNeedsDisplay];


原答案

您不必以不同的方式处理文本视图。

我首先担心您对“loadview”的调用。你永远不应该直接调用它。它会在需要时自动调用。

另外,您应该在循环之前声明 contentview 并且您正在泄漏内存。

您的另一个问题是您在循环期间永远不会更改每个视图的框架。它们的原点都是 0,0。据我从您的代码中可以看出。这可能就是您的视图被隐藏的原因。

最后,在风格说明上,我不会称我为视图控制器 XXXXXview,它们应该有控制器这个词。

    CGRect frame;
    ContentViewController *myContentViewController = nil;

    for(int i=0; i< 5; i++)
      myContentViewController = [[myContentViewController alloc] initWithNibName:@"ContentView" bundle:[NSBundle mainBundle]];

      frame = myContentViewController.view.frame;
      frame.origin.x=(frame.size.width*i);
      myContentViewController.view.frame=frame; 

      myContentViewController.theLabel.text =[NSString stringWithFormat:@"hello again..%d", i];
      [self.scrollView addSubview: myContentViewController.view];
      [myContentViewController release];
    

添加: 还要检查scrollviews contentView frame 属性:

scrollView.contentSize = CGSizeMake(numberOfContentViews*contentViewWidth, contentViewHeight);

添加更多:

尝试以编程方式在 viewDidload 或 viewDidAppear 中添加 textView 以查看是否有效。

在您的 cmets 之后,如果我不得不再次猜测,我会说您可能会在添加 textView 后在代码中的其他位置对其进行操作。开始注释掉任何影响 textView 的行,看看会发生什么。

【讨论】:

不是 viewDidLoad,loadView。调用 viewDidLoad 有时是必要的,但不是 loadView (AFAIK)。另外,您是否将滚动视图的 contentView 大小设置为:(numberOfContentViews*contentViewWidth)? 谢谢。在我让 textview 工作之前,调用 viewDidLoad 是暂时的。否则,我将不得不创建非 iBOutlet 属性,然后在 viewDidLoad 期间进行分配。在您的代码的第一个视图之后,文本视图仍然不显示。标签仍然显示正常。我还可以在其中添加带有标签的 UIWebView 和 UIScrollView。它们显示在所有页面上。 是的 (numberOfContentViews*contentViewWidth) 问题。内容视图显示正常。我可以在每个角落放置控件并查看它们。我也尝试在中间放置一个文本视图,但在第一个视图后它消失了。 您可以尝试在 viewDidLoad 中以编程方式添加 textView,看看您是否有同样的问题。

以上是关于将 UITextView 添加为 UIView 中的子视图,然后添加到 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

在 UIView 上缩放 UITextView 的字体大小

您如何将 UITextView 居中作为 UIView 的子视图?

如何以编程方式将文本添加到 UIView

UITextView 和 UILabel 子视图属性为零

在 UITextView 编辑时移动 UIView

iOS Swift - 动态增加 UITextView 和父 UIView 的高度