【问题标题】:Custom control doesn't display in window自定义控件不显示在窗口中
【发布时间】:2010-12-01 14:15:10
【问题描述】:

我创建了基于视图的应用程序。并添加了从 UIView 扩展的新类。该类中包含一些控件(简单控件)。现在我想在用户点击某些东西时显示/隐藏这个控件。控件应显示为覆盖窗口。在所有其他控件之上。我尝试这样做:

- (void)viewDidLoad {
    [super viewDidLoad];        
    addSubview:myOverlayChannelPicker;
}

一切正常,调试自定义控制代码,但屏幕上没有显示。我尝试手动添加它并且它可以工作,但我需要在运行时添加它。不显示控件的原因可能是什么?

OverlayChannelPicker 的完整代码

@implementation OverlayChannelPicker
@synthesize myImage;
@synthesize img1;
@synthesize img2;

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

- (void)awakeFromNib{
    img1 = [UIImage imageNamed:@"imgTest.jpg"];
    img2 = [UIImage imageNamed:@"imgTest2.jpg"];

    arrayOfImages = [[NSMutableArray alloc] init];
    [arrayOfImages addObject:img1];
    [arrayOfImages addObject:img2];
    [arrayOfImages addObject:img1];
    [arrayOfImages addObject:img2];
    [arrayOfImages addObject:img1];
    [arrayOfImages addObject:img2];
    [arrayOfImages addObject:img1];
    [arrayOfImages addObject:img2];
    [arrayOfImages addObject:img1];
    [arrayOfImages addObject:img2];
    [arrayOfImages addObject:img1];
    [arrayOfImages addObject:img2];

    scrollView = [[UIScrollView alloc] init];
    scrollView.scrollEnabled = YES;
    scrollView.pagingEnabled = NO; // for smooth scroll
    scrollView.directionalLockEnabled = YES;
    scrollView.showsVerticalScrollIndicator = NO;
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.delegate = self;
    //scrollView.backgroundColor = [UIColor blueColor];
    scrollView.autoresizesSubviews = YES;
    scrollView.frame = CGRectMake(0, 150, 320, 128);
    [scrollView setContentSize:CGSizeMake(1620, 128)];
    [self addSubview:scrollView];

    UIImage *imageToAdd;
    int x = 0;
    int y = 0;
    for(imageToAdd in arrayOfImages)
    {       
        UIImageView *temp = [[UIImageView alloc] initWithImage:imageToAdd];     

        temp.frame = CGRectMake(x, y, 128, 128);
        temp.userInteractionEnabled = YES;      
        x += 135;


        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)];
        [temp addGestureRecognizer:tap];    

        [scrollView addSubview:temp];
    }

}

- (void)imageTapped:(UIGestureRecognizer *)sender
{       
    UIImageView *iv = (UIImageView *)[sender view];
    UIImage *image = [iv image];
    UIImage *it = [arrayOfImages indexOfObject:image];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:iv cache:YES];

    if(it == img1)
        it = img2;
    else
        it = img1;

    [UIView commitAnimations];  
}

它是标题:

@interface OverlayChannelPicker : UIView <UIScrollViewDelegate>{
    IBOutlet UIImageView *myImage;
    UIImage *img1;
    UIImage *img2;  

    IBOutlet UIScrollView *scrollView;
    int view1Index;
    int view2Index; 
    NSMutableArray *arrayOfImages;

}
@property (nonatomic, retain) UIImageView *myImage;
@property (nonatomic, retain) UIImage *img1;
@property (nonatomic, retain) UIImage *img2;
@property (nonatomic, retain) UIScrollView *scrollView;

- (void)awakeFromNib;
@end

【问题讨论】:

  • 但是如何创建myOverlayChannelPicker?你确认它不是 nil 吗?
  • 我添加到标题:OverlayChannelPicker *myOverlayChannelPicker;并为其添加了属性/综合。然后调用 [self.view addSub...];
  • 我添加了这个但仍然无法正常工作(它不是 NIL):-(IBAction) btnOk_Click { myOverlayChannelPicker = [[OverlayChannelPicker alloc] init]; if(myOverlayChannelPicker != nil){ [self.view addSubview:myOverlayChannelPicker]; } }
  • 愚蠢的人为错误因素 :) 我没有将我的新实例“myOverlayChannelPicker”连接到界面生成器中的变量。现在它可以工作了:)

标签: iphone objective-c uiview uiwindow


【解决方案1】:

你可能想这样打电话:

[self.view addSubview:myOverlayChannelPicker];

从您发布的代码示例来看,我不得不假设您之前没有进行过任何 Objective-C 开发。如果是这种情况,您可能应该从Introduction to The Objective-C Programming Language 开始了解基础知识。

【讨论】:

  • 那也行不通。即使我输入 self addSu ... 'addSubview' 也没有完整的代码:(
  • 还是不行 :( 你猜对于目标 C :) 我来自 C# 背景,但尝试边做边学 :)
  • 边做边学是最好的方法。 Objective-c 第一次有点令人生畏,与 C# 相比,有些东西与 C# 不同,比如调用方法,而且手动内存管理在开始时可能会很痛苦。但是一旦你开始了它就会很有趣。另一个不错的起点是cocoadevcentral.com/d/learn_objectivec
  • 谢谢 :),但不要离问题太远,我仍然需要帮助才能使这个 UIView 运行...
  • 如果我的答案中发布的代码不起作用,一个问题可能是myOverlayChannelPicker 没有正确初始化或根本没有初始化。您可能应该用您如何创建myOverlayPicker 来更新您的问题。
猜你喜欢
  • 2019-10-08
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多