0

我有我自己的 UIView :

#import <UIKit/UIKit.h>

@interface MultipleSlotsClientView : UIView


-(IBAction)didPressCloseBtn:(id)sender;

@end

这是实现:

@implementation MultipleSlotsClientView

- (id)initWithFrame:(CGRect)frame {
    self = [[[[NSBundle mainBundle] loadNibNamed:@"MultipleSlotsClientView" owner:self options:nil] objectAtIndex:0] retain];
    if (self) {
        self.frame = frame;
    }
    return self;
}

#pragma mark
#pragma mark IBAction

-(IBAction)didPressCloseBtn:(id)sender {
    [self removeFromSuperview];
}

@end

而且我有一个连接到该didPressCloseBtn方法的 btn,当我按下按钮时,该方法调用但视图不会从超级视图中删除。

这就是我分配 UIView 并添加它的方式:

MultipleSlotsClientView *multiView = [[[MultipleSlotsClientView alloc] initWithFrame:self.view.frame] autorelease];
[self.view addSubview:multiView];

知道为什么视图不会消失吗?

4

3 回答 3

2

只需尝试如下图所示连接,不要连接到 FileOwner。在此处输入图像描述

于 2013-05-15T09:21:19.750 回答
0

Step-1 在 NSObject Category 类中编写以下方法

+ (id)loadNibNamed:(NSString *)NibName {
    NSObject *cl = nil;
    if (NSClassFromString(NibName) != nil) {
        NSArray *arr = [[NSBundle mainBundle] loadNibNamed:NibName owner:self options:nil];
        for (id cls in arr) {
            if([cls isKindOfClass:NSClassFromString(NibName)])
            {
                cl = cls;
                break;
            }
        }
    }
    return cl;
}

步骤:2调用相应的类

MultipleSlotsClientView *multiView = [MultipleSlotsClientView loadNibNamed:@"MultipleSlotsClientView"]
[self.view addSubview:multiView];

并且不需要在“initWithFrame”中写任何东西。尝试这个。它可能对你有用。

于 2013-05-15T09:30:34.660 回答
0

这是对评论的回答。只是因为你不能很好地格式化评论。这是关于为什么在代码中泄漏内存以及如何编写代码来克服这个问题。

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // Do something here if you have to.
        // Currently there is no reason for overwriting intiWithFrame: at all. 

    }
    return self;
}

而不是:

MultipleSlotsClientView *multiView = [[[MultipleSlotsClientView alloc] initWithFrame:self.view.frame] autorelease];

做就是了:

MultipleSlotsClientView *multiView= [[[[NSBundle mainBundle] loadNibNamed:@"MultipleSlotsClientView" owner:self options:nil] objectAtIndex:0] autorelease];
multiView.frame = self.view.frame;

好吧,您是否应该保留或自动释放它或根本不应该依赖于其他代码。假设您将 multiView 添加到子视图层次结构中,它将保留它,自动释放就可以了。

于 2013-05-15T12:25:10.837 回答