【问题标题】:SubViews not properly initialized using IB未使用 IB 正确初始化子视图
【发布时间】:2009-12-08 04:55:39
【问题描述】:

我无法使用 Interface Builder 正确初始化子视图。我有以下视图层次结构(UIWindow -> BlankCanvasView -> StalkerView)。 BlankCanvasView 是 UIView 的子类,StalkerView 是 BlankCanvasView 的 IBOutlet

@interface BlankCanvasView : UIView {

IBOutlet UIView *stalker;

}

@结束

我已经在 BlankCanvasView 的 stalker outlet 和 subview 之间建立了连接。但是,在我的 BlankCanvasView 的 touchesBegin 方法中,跟踪者出口为零。请参阅下面的 touchesBegin。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

NSLog(@"Touch Begin detected!!!");
NSLog(@"Stalker instance %@", stalker);

[UIView beginAnimations:@"StalkerAnimation" context:nil];

UITouch *touch = [touches anyObject];

    //stalker is nil here!!!
[stalker setCenter:[touch previousLocationInView:self]];

[UIView commitAnimations];

}

我错过了什么?当我尝试按照 iTunesU 上的示例进行操作时,我的演示应用程序似乎都没有正确加载任何子视图。

【问题讨论】:

    标签: iphone objective-c xcode uiview


    【解决方案1】:

    如果您在 IB 中创建“跟踪者”视图,它必须是视图层次结构的一部分(即作为另一个视图的子视图添加),或者它必须由您的代码保留,以免它加载后释放。如果你为你的 stalker 变量使用了一个 retain 属性,这将自动为你处理好:

    @interface BlankCanvasView : UIView
    {
        UIView *stalker;
    }
    
    @property (nonatomic, retain) IBOutlet UIView *stalker;
    
    @end
    

    确保你@synthesize stalker;在您的 BlankCanvasView 的实现中,并在您解除分配视图时将该属性设置为 nil:

    @implementation BlankCanvasView
    @synthesize stalker;
    
    - (void)dealloc
    {
        self.stalker = nil;
        [super dealloc];
    }
    
    @end
    

    【讨论】:

    • 嗨 Slayer,我实际上已经尝试了两种方式,只使用了 iVar 和具有保留语义的属性。在任何一种情况下,属性或 iVar 都是 nil。看了其他类似的帖子,不知是否需要重写UIView类的awakeFromNib方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2012-06-17
    • 2022-01-22
    • 2014-10-24
    相关资源
    最近更新 更多