2013-03-14 46 views
-1

叫我有一個具有以下的Objective-C - >無法訪問NSDatePicker如果超類方法是從子類

-(void) addDate method 
    NSDate *myDate = [myDatePIcker dateValue]; 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"YYYYMMdd"]; 
    NSLog(@"addDate date is:%@",[dateFormat stringFromDate:myDate]); 

當我打電話從上面的方法和IBAction爲這樣一類HelloWorldViewController ...

- (IBAction)myAddDate:(id)sender { 
    [self addDate]; 
} 

它按預期工作(見下面的NSLog)

2013-03-14 09:05:33.149 APPNAME[3531:303] AWAKENED in Hello 2013-03-14 16:05:33 +0000 
    2013-03-14 09:05:33.150 APPNAME[3531:303] AWAKENED in Hello (null) 
    2013-03-14 09:05:35.898 APPNAME[3531:303] addDate date is:20130314 
    2013-03-14 09:05:35.899 APPNAME[3531:303] addDate completed with date 20130314 

但是,如果我稱之爲 - (從另一個類(TableViewController),這是子類的方法(datePickerAction)無效)功能,見下文......

@implementation TableViewController:HelloWorldViewController 

-(IBAction)datePickerAction:(id)sender{ 
    [self addDate]; 
} 

這是NSLog的

2013-03-14 09:08:01.719 APPNAME[3549:303] AWAKENED in Hello 2013-03-14 16:08:01 +0000 
2013-03-14 09:08:01.720 APPNAME[3549:303] AWAKENED in Hello (null) 
2013-03-14 09:08:03.321 APPNAME[3549:303] addDate date is:(null) 
2013-03-14 09:08:03.322 APPNAME[3549:303] addDate completed with date (null) 
2013-03-14 09:08:03.323 APPNAME[3549:303] addDate date is:(null) 
2013-03-14 09:08:03.323 APPNAME[3549:303] addDate completed with date (null) 

我是綠色的輸出,去容易:-)任何建議表示讚賞!

更新:我試圖實施下面的解決方案。這是更新的&附加代碼。該應用程序現在不會啓動...任何建議。

@implementation HelloWorldViewController; 

-(id) init{ 

HelloWorldViewController *myHelloWorldController = [[HelloWorldViewController alloc] init]; 
return self; 
} 



#import <Foundation/Foundation.h> 
#import <Cocoa/Cocoa.h> 
#import "HelloWorldViewController.h" 
#import "Date.h" 

>

@interface TableViewController : NSTableView <NSTableViewDataSource> { 

IBOutlet NSTableView *tableview; 
NSMutableArray *list;} 




#import "TableViewController.h" 
#import "HelloWorldViewController.h" 

@implementation TableViewController{ 
HelloWorldViewController *myHelloWorldViewController;} 

- (id) init{ 

self = [super init]; 
if (self) { 
    list = [[NSMutableArray alloc] init]; 
} 
return self;} 



- (IBAction)datePickerAction:(id)sender{ 
    [myHelloWorldViewController addDate]; 


    //NSLog(@"Action Finished with date %@", myRename);} 

回答

0

沒有足夠的信息,在你的問題要弄清楚的問題是什麼,所以下面是一個猜測...

你可能會感到困惑過如何子類作品。

在您的addDate方法中,您引用了一個變量myDatePicker。由於這並未在addDate中聲明,因此它可能是類的實例變量,或者不太可能是全局變量。

綜觀addDate其本地變量myDatenil如果myDatePickernil - 消息nil被允許在Objective-C,並返回nil

爲了第一次測試成功,您必須有一個addDate的類的實例HelloWorldViewController,並且該實例必須具有非零myDatePicker

現在你的第二課TableViewController,這是HelloWorldViewController的子類。在其實例方法datePickerAction中,您調用addDate作爲繼承方法,但在這種情況下,您會發現它不起作用,但會生成空值。

這會暗示您的TableViewController實例的繼承myDatePicker實例變量是nil

這是混淆子類可能出現的地方。您必須完全區分對象:第一個是HelloWorldViewController類的實例;第二個是TableViewController類的一個實例。這第二個對象包含以本身其超,HelloWordlViewController的實例變量的一部分,這些變量是不同從在HelloWordlViewController其他情況下的任何其他變量,尤其是你的第一個對象的...

我的猜測是你的第一個對象有一個非零myDatePicker,在你的第二個對象是零。

可能建議,而不是TableViewController是一個子類去HelloWorldViewController您的設計需要它含有參考到一個單獨的HelloWorldViewController實例,沿着線的東西:

@interface TableViewController : NSViewController or NSObject 
    ... 
@end 

@implementation TableViewController 
{ 
    HelloWorldViewController *myHelloWorldViewController; // set up in init etc. 
} 

- (IBAction)myAddDate:(id)sender 
{ 
    [myHelloWorldViewController addDate]; 
} 

... 

@end 

HTH,但記住這個答案是一個猜測,因爲在你的問題中沒有足夠的信息來知道這是否是你的問題。

評論響應

你似乎誤會基本對象&繼承模型。現在您已經添加到HelloWorldViewController

-(id) init 
{ 
    HelloWorldViewController *myHelloWorldController = [[HelloWorldViewController alloc] init]; 
    return self; 
} 

首先你必須初始化超類中的init()方法,這往往只是聲明:

self = [super init]; 

沒有這個您的實例不會被正確構造。

第二你似乎試圖初始化另一個類的一個實例變量,在您要創建HelloWorldViewControllerHelloWorldViewControllerinit方法的一個實例,並將其分配到一個局部變量這恰好具有相同名稱作爲TableViewController的實例變量 - 這兩個變量沒有任何關聯(因爲在世界上被稱爲「威廉」的所有人都不是同一個人)。

但你一個更大的問題,你HelloWorldViewControllerinit方法現在要求你HelloWorldViewControllerinit方法,它調用......是的,這是無限的,您的計算機上表示,直到內存已滿,並且你的申請死了可怕的死亡。

你可能需要去研究類和實例的概念,因爲你的代碼表明你沒有正確理解它們。基於(基於繼承的)面向對象概念上的任何好文本都應該這樣做;這些概念在大多數當前面嚮對象語言(包括Java和C#)中基本相同。

HTH

+0

我添加了關於我在哪裏嘗試的代碼,現在我遇到了啓動應用程序的問題。我可以展示哪些信息以幫助診斷?謝謝! – loopifnil 2013-03-14 19:32:49

+0

Doh,我應該抓住無限的呼喚。我看到你對「威廉」比較的觀點。我將修改程序的結構,以代替使用我的HelloWorldViewController來接收myDatePicker的委託操作,它將委託給TableViewController,它不必使用中間類。感謝您的幫助,瞭解這一點,非常感謝。我也將清理我的繼承知識。 :-) – loopifnil 2013-03-14 20:42:05