2013-05-15 72 views
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按鈕調用方法,但視圖不會從超級視圖中移除。

這是我的Alloc了UIView,並將其添加:

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

任何想法,爲什麼認爲不會消失?

+0

你能提供與我的屏幕截圖一樣的截圖嗎? –

+0

你能登錄超級視圖嗎?在IBAction裏面的NSLog(「%@」,self.superview) –

+0

把NSLog放在你的回調中檢查它是否被調用總是一個好習慣。正如Daij所問。 – nzs

回答

2

剛剛嘗試連接如下面的截圖,不要連接到FileOwner。 enter image description here

+0

'下面的截圖'在哪裏? – utsabiem

+0

對您而言不可見? –

0

第1步寫NSObject的範疇類下面的方法

+ (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」 寫什麼。 試試這個。它可能適合你。

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添加到子視圖層次結構中,它將保留它,autorelease是好的。