Xcode - 子视图不可见

Posted

技术标签:

【中文标题】Xcode - 子视图不可见【英文标题】:Xcode - subview not visible 【发布时间】:2013-05-23 16:53:51 【问题描述】:

我创建了一个带有 UIScrollView 的 UIViewController。在 scrollView 我有一个页面控件。当我测试它时,我能够水平滚动浏览四个不同颜色的页面。现在我需要添加我需要的实际视图。在项目的不同部分,我使用 coreplot 创建了一个折线图。现在我添加了一个新的 UIview 并添加了折线图的代码。我现在正在尝试用线图 UIView 替换滚动视图的第一页。我没有收到任何错误,但屏幕上也没有出现任何错误。它只是滚动视图的默认背景。 scrollView 仍然可以正确滚动其他页面。我以编程方式向 UIView 添加了一个按钮,以查看它是否与 coreplot 有关,但我也看不到。这是我的一些代码。我会很感激任何建议。谢谢。

我的主视图控制器的 viewDidLoad 方法: - (void)viewDidLoad [超级viewDidLoad];

    NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor],     [UIColor blueColor], [UIColor purpleColor], nil];

    CGRect frame;
    frame.origin.x = self.scrollView.frame.size.width;
    frame.origin.y = 0;
    frame.size = self.scrollView.frame.size;

    self.alertsSubView = [[AlertsView alloc] initWithFrame:frame];
    [self.scrollView addSubview:_alertsSubView];


    for (int i = 1; i < numberOfGraphs; i++) 
        CGRect frame;
        frame.origin.x = self.scrollView.frame.size.width * i;
        frame.origin.y = 0;
        frame.size = self.scrollView.frame.size;
        UIView *subview = [[UIView alloc] initWithFrame:frame];
        subview.backgroundColor = [colors objectAtIndex:i];
       [self.scrollView addSubview:subview];

        self.alertsSubView.delegate = self;

    _scrollView.delegate = (id)self;

    

    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * colors.count,   self.scrollView.frame.size.height);

这是我的 UIView 中的 initWithFrame 方法的代码。所有的 NSLog 语句都会运行,所以我知道所有的东西都被调用了:

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
        NSLog(@"AlertsView initWithFrame");

        ///button for testing
        self.button = [UIButton buttonWithType:UIButtonTypeCustom];
        CGRect buttonFrame = CGRectMake(0,0, frame.size.width, frame.size.height);
        self.button.frame = buttonFrame;
        [self.button addTarget:self
                        action:@selector(buttonTouched)
              forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:self.button];


        [self initPlot];
    
    return self;

我还添加了 initPlot 和 ConfigureHost 方法,以防它们相关:

-(void)initPlot 
    NSLog(@"into init plot");
    [self configureHost];
    [self configureGraph];
    [self configurePlots];
    [self configureAxes];
    NSLog(@"endo of init plot");


-(void)configureHost 
    NSLog(@"into configure host");
    self.hostView = [(CPTGraphHostingView *) [CPTGraphHostingView alloc]         initWithFrame:self.bounds];
    self.hostView.allowPinchScaling = YES;
    [self addSubview:self.hostView];

【问题讨论】:

是否调用绘图数据源?如果不是,您可能在其他配置方法之一中存在配置问题。 绘图数据源确实被调用。当我尝试它时,我将整个内容显示在 UIViewController 中。只是现在我已将代码移动到 UIView 并尝试将其作为子视图添加到 UIScrollView 中,我遇到了这个问题。我完全复制了所有内容。唯一的区别是 'initPlot' 在 vi​​ewDidAoear:animated 在我在 VC 的原始版本中。现在我将它放在 UIView 中,我不得不将它移动到 initWithFrame,因为 viewDidAppear 不是 UIView 方法。 '-(void)viewDidAppear:(BOOL)animated [super viewDidAppear:animated]; [_alertsSubView initPlot]; NSLog(@"viewDidAppear - statsvc"); ' 我尝试将其添加到 vc 中,但尽管它被调用但屏幕上仍然没有任何内容。甚至我为子视图设置的背景颜色也不显示。 【参考方案1】:

我终于想通了。感谢您的建议@Eric Skroch。它实际上引导我找到了正确的答案,即使这不是问题所在。基本上要解决这个问题,我必须将所有逻辑移动到视图控制器中并更改大量代码的顺序。我在这里发布了我修改后的视图控制器的相关部分,以防有人遇到类似的情况。

-(void)viewDidAppear:(BOOL)animated 
    [super viewDidAppear:animated];
    [_alertsSubView initPlot];

- (void)viewDidLoad

    [super viewDidLoad];
    NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor],   [UIColor blueColor], [UIColor purpleColor], nil];
    alertFrame.origin.x = self.scrollView.frame.size.width;
    alertFrame.origin.y = 0;
    alertFrame.size = self.scrollView.frame.size;
    _panel = [[UIView alloc]initWithFrame:alertFrame];

    for (int i = 1; i < numberOfGraphs; i++) 
        CGRect frame;
        frame.origin.x = self.scrollView.frame.size.width * i;
        frame.origin.y = 0;
        frame.size = self.scrollView.frame.size;
        UIView *subview = [[UIView alloc] initWithFrame:frame];
        subview.backgroundColor = [colors objectAtIndex:i];
        [self.scrollView addSubview:subview];
    
    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * colors.count, self.scrollView.frame.size.height);
    _scrollView.delegate = (id)self;
    self.alertsSubView.delegate = self;

-(AlertsView *)alertsSubView

    if(!_alertsSubView)
    
        CGRect alertsViewFrame = CGRectMake(0,0, _panel.bounds.size.width,     _panel.bounds.size.height);
        _alertsSubView = [[AlertsView alloc] initWithFrame:alertsViewFrame];
        _alertsSubView.backgroundColor = [UIColor purpleColor];
        [self.scrollView addSubview:self.alertsSubView];
    
    return _alertsSubView;

【讨论】:

以上是关于Xcode - 子视图不可见的主要内容,如果未能解决你的问题,请参考以下文章

CFBundleUrlTypes 在 Info.plist 中可见,但在它的 XCode 视图中不可见

子视图永远不可见

XIB 子视图不可见

当我在 xcode 5(ios 6.1 模拟器)中使用 removeFromSuperview 时,滚动视图不可见

CAGradientLayer 导致子视图不可见

当作为子视图添加到集合视图单元格时,滚动视图中的内容不可见