2011-11-26 80 views
0

我遇到了一些麻煩,從nib加載子類UIViewController。我的viewDidLoad函數永遠不會被調用。viewDidLoad從來沒有調用子類UIViewController

超級沒有筆尖,但是每個子類都有自己的筆尖。即

@interface SuperClass : UIViewController { 
} 
@end 


@interface SubClass : SuperClass{ 
} 
@end 
@implementation SubClass 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
} 
return self; 
} 
- (void)viewDidLoad{ 
// Never called 
} 

的觀點是從筆尖加載如下:

SubClass *scvc = [[SubClass alloc]  initWithNibName:@"SubClass" bundle:nil]; 
    [self.navigationController pushViewController:scvc animated:YES]; 
    [scvc release]; 

沒有此名稱的筆尖文件,它有它的文件所有者類設置正確。

viewDidLoad不在子或超級中調用。有任何想法嗎?

+0

你確定筆尖裝載正確嗎,你能在現場看到它嗎?你可以添加NSLog(@「Methods%@ called」,NSStringFromSelector(_cmd));檢查哪些方法被調用。 – Tieme

+0

不,筆尖加載不正確。從Super類中的代碼創建的視圖被加載,但nib文件中的視圖從未加載(所有IBOUtlets均爲零)。你會在哪裏登錄被調用的方法? – Steve

回答

0

嘗試添加:

[super viewDidLoad]; 
+0

是的超級viewDidLoad被調用。爲了清楚起見,在這裏的帖子中刪除了它。不管怎麼說,這個方法都不會被調用。 – Steve

0

這哪裏是塊位於

SubClass *scvc = [[SubClass alloc]  initWithNibName:@"SubClass" bundle:nil]; 
    [self.navigationController pushViewController:scvc animated:YES]; 
    [scvc release]; 

你確定它叫什麼名字?

我做了一個testproject來測試它和下面的工作:

在你appDelegate.m文件我放置在應用程序didFinishLaunchingWithOptions方法

UINavigationController *navController = [[UINavigationController alloc] init]; 
self.window.rootViewController = navController; 

SubClass *viewController1 = [[[SubClass alloc] initWithNibName:@"SubClass" bundle:nil] autorelease]; 

[navController pushViewController:viewController1 animated:YES]; 

以下SuperClass.h

#import <UIKit/UIKit.h> 

@interface SuperClass : UIViewController 
@end 

SuperClass.m

#import <UIKit/UIKit.h> 
#import "SuperClass.h" 

@implementation SuperClass 
@end 

SubClass.h

#import <UIKit/UIKit.h> 
#import "SuperClass.h" 

@interface SubClass : SuperClass 
@end 

SubClass.m

#import <UIKit/UIKit.h> 
#import "SubClass.h" 

@implementation SubClass 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    NSLog(@"Methods %@ called", NSStringFromSelector(_cmd)); 
    [super viewDidLoad]; 
     // Do any additional setup after loading the view, typically from a nib. 
} 
@end 

這對我的作品,一定要設置正確的類爲您nibFile以及。點擊文件的所有者圖標,並將類從UIViewController更改爲SubClass

+0

該塊位於推動此視圖的另一視圖控制器中。它被稱爲。 我找到了解決方案 - 我在上述問題中的簡化實際上排除了問題代碼。在真正的應用程序中有兩個被調用的超類。其中之一,我正在初始化一個設置函數的代碼中的主視圖,因此我認爲它重寫了對該筆尖的調用,而其他視圖從未加載過。謝謝! – Steve

2

你說你是在超類的代碼中創建視圖(使用loadView),但試圖在子類中使用一個筆尖?

按照文檔的UIViewController(重點煤礦)

如果您使用筆尖文件中指定的觀點,你必須不覆蓋的loadView而是應該建立在Interface Builder一個榫文件...

看起來你可能會在那裏發生衝突。作爲一個測試,在你的超類中註釋掉loadView方法並且看看你在哪裏。

1

我假設SuperClass實現了loadView。所以當你的SubClass被要求加載視圖時,你會得到你的SuperClass的實現,它會覆蓋正常的nib加載機制。

我會在這裏重新考慮你的設計。你的SuperClass的行爲與你想要的子類完全不同。也許那不是那裏最好的關係。

但是,如果你願意,你應該能夠至少能讓它在你的SubClass.m完成這部分工作:

-(void)loadView { 

    IMP defaultImp = class_getMethodImplementation([[self superclass] superclass], _cmd); 

    /* or alternatively... 
    IMP defaultImp = class_getMethodImplementation([UIViewController class], _cmd); 
    */ 

    defaultImp(self, _cmd); 
} 

這實現了你的子類loadview這跳過的你的loadView SuperClass並調用默認實現。

IMO,這是醜陋的,如果您的類層次擴展,可能需要重新訪問。我不會在自己的應用程序中執行此操作,而是重新考慮類層次結構。

相關問題