2012-08-12 64 views
0

因此,假设我有两个视图,MyViewMySubview,这两个视图的子类都是UIView子类定制UIView - 如何初始化

View.h:

@interface MyView : UIView <ProgressCallback> 
@property (retain, nonatomic) IBOutlet UIProgressBar *progress; 

- (id) initWithFrame: (CGRect) frame; 
- (void) progressUpdated: (NSNumber) newProgress; 

@end 

View.m

@implementation MyView 
@synthesize progress = _progress; 

- (id)initWithFrame:(CGRect)frame; 
{ 
    self = [super initWithFrame:frame]; 

    if (self){ 
     NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"MyViewNibFile" 
                   owner:nil 
                  options:nil]; 

     if ([arrayOfViews count] < 1){ 
      [self release]; 
      return nil; 
     } 

     View *newView = [[arrayOfViews objectAtIndex:0] retain]; 
     [newView setFrame:frame]; 

     [self release]; 
     self = newView; 

     self.progress.progress = .25 // This will work and change it. 
    } 

    return self; 
} 

- (void) progressUpdated: (NSNumber) newProgress { 
    self.progress.progress = newProgress.floatValue; // This also works! 
} 

我发现通过浏览苹果的文档和StackOverflow上创建的UIView的子类的这个方法。它的工作原理,我可以根据回调来设置我的进度,它会出现,等等。我的问题是当我想子视图。

MySubview.h

@interface MySubview : MyView 
@property (retain, nonatomic) IBOutlet UIImageView *image; 
@end 

MySubview.m

@implementation MySubview

- (id)initWithLabel: (UIImageView *) image andWithFrame:(CGRect)frame; 
{ 
    self = [super initWithFrame:frame]; 

    if (self){ 
     NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"MySubViewNibFile" 
                   owner:nil 
                  options:nil]; 

     if ([arrayOfViews count] < 1){ 
      [self release]; 
      return nil; 
     } 

     MySubbiew *newView = [[arrayOfViews objectAtIndex:0] retain]; 
     [newView setFrame:frame]; 

     [self release]; 
     self = newView; 

     self.progress.progress = .25 // This will work and change it. 
     self.image = image; // Also works 
    } 

    return self; 
} 

无论我如何初始化我的子类,我不能让进度条在子类工作。我可以在init中设置它,但它不是零,但它显然不对应于init后的视图中的那个。我认为这与我释放自己的事实有关,但是如果我想返回一个类型为View的类,则看不到其他选择。我使用相同样式的init,只是将类名更改为Subview。回调实际上被调用并且在代码中改变,但它不更新显示。所有东西都正确地连接在笔尖上,除了尺寸以外,它们是相同的,在这种情况下,它们与图像相同。

(我尽量使示例代码简单,并尽可能清楚。如果我没有成功,请让我知道,我会更新它。)

你如何正确子类的UIView ?我阅读了文档,没有任何证据可以启发,但请随时指出我的方向。具体而言,我必须重写什么才能让所有内容指向正确的项目?也就是显示器上的那些。

+0

可可触摸与可可不一样,所以这个问题不应该相应地编辑。 – 2012-08-12 13:26:53

+0

self = newView;这不会破坏继承。如果您以后想要子类MySubview,您的初始化程序将returen MySubview类而不是您要创建的新类。 – 2016-03-09 11:28:14

回答

0

您在initWithLabel:andWithFrame:方法调用initWithFrame:后覆盖自我价值

这一行:

self = newView; 

覆盖这是在MyView的超init方法创建的自我价值,所以你失去所有定制你有

0

如果你也有这个问题,你可能做错了,因为我是。

一般:

如果您与内容搞乱,覆盖UIViewController

如果您正在搞乱几何,请覆盖UIView

这解决了我的问题,虽然技术上我的代码有什么问题是wattson12说的。