-1

次のクラスHelloWorldViewControllerがあります

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

上記のメソッドをから呼び出すと、このようにIBAction ...

- (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)からその-(void)関数を呼び出す場合は、以下を参照してください...

@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);}
4

1 に答える 1

0

あなたの質問には問題が何であるかを理解するのに十分な情報がないので、以下は推測です...

サブクラス化がどのように機能するかについて混乱するかもしれません。

addDateメソッドでは、変数を参照しますmyDatePicker。これはで宣言されていないためaddDate、クラスのインスタンス変数であるか、可能性は低いですがグローバル変数です。

addDateそのローカル変数を見ると、次のようmyDateになります-メッセージtoはObjective-Cで許可され、を返します。nilmyDatePickernilnilnil

最初のテストを成功させるには、addDateのクラスのインスタンスが必要であり、そのインスタンスにはnil以外のインスタンスが必要です。HelloWorldViewControllermyDatePicker

TableViewController次に、のサブクラスである2番目のクラスに移りHelloWorldViewControllerます。そのインスタンスメソッドでは、継承されたメソッドとしてdatePickerAction呼び出しますがaddDate、この場合は機能しませんが、null値を生成します。

TableViewControllerこれは、インスタンスの継承されたmyDatePickerインスタンス変数がであるということを示唆していますnil

ここで、サブクラス化に関する混乱が生じる可能性があります。オブジェクトを完全に区別する必要があります。最初はHelloWorldViewControllerクラスのインスタンスです。2番目はTableViewControllerクラスのインスタンスです。その2番目のオブジェクトには、そのスーパークラスのインスタンス変数が含まれてます。これらの変数は、他のインスタンス、特に最初のオブジェクトのインスタンスの他の変数とHelloWordlViewController異なります。HelloWordlViewController

私の推測では、最初のオブジェクトにはnil以外がmyDatePickerあり、2番目のオブジェクトにはnilがあります。

これは、サブクラスになるのではなく、次のような別のインスタンスへの参照を設計に含める必要があることを示唆している可能性があります。TableViewControllerHelloWorldViewControllerHelloWorldViewController

@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];

これがないと、インスタンスは適切に構築されません。

次に、別のクラスのインスタンス変数を初期化しようとしているように見えます。つまり、のメソッドHelloWorldViewController にインスタンスを作成し、それをローカル変数に割り当てています。このローカル変数は、たまたまのインスタンス変数と同じ名前です。これら2つ変数には何の関係もありません(世界中で「ウィリアム」と呼ばれるすべての人が同じ人ではないため)。initHelloWorldViewControllerTableViewController

しかし、さらに大きな問題があります。あなたHelloWorldViewControllerinitメソッドは、を呼び出すHelloWorldViewController'initメソッドを呼び出すようになりました...はい、それは無限です。これは、コンピュータ上では、メモリがいっぱいになり、アプリケーションが恐ろしい死を迎えるまでのことです。

コードがそれらを正しく理解していないことを示唆しているので、おそらくクラスとインスタンスの概念を調べに行く必要があります。(継承ベースの)オブジェクト指向の概念に関する優れたテキストはすべて実行する必要があります。これらの概念は、JavaやC#を含む現在のほとんどのオブジェクト指向言語で基本的に同じです。

HTH

于 2013-03-14T17:43:21.700 に答える