Objective-C - >如果从子类调用超类方法,则无法访问NSDatePicker

时间:2013-03-14 16:10:31

标签: objective-c cocoa nstableview nsdatepicker

我有一个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"

&GT;

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

1 个答案:

答案 0 :(得分:0)

您的问题中没有足够的信息来确定问题是什么,以下是猜测......

您可能会对子类化的工作方式感到困惑。

addDate方法中,您引用变量myDatePicker。由于这不是在addDate中声明的,因此它或者是类的实例变量,或者不太可能是全局变量。

如果addDatemyDate,则查看nil其本地变量myDatePickernil - 目标中允许向nil发送消息-C并返回nil

您必须拥有addDateHelloWorldViewController的实例才能成功完成第一次测试,并且该实例必须具有非零myDatePicker

现在到你的第二课TableViewController,这是HelloWorldViewController的一个子类。在其实例方法datePickerAction中,您将addDate称为继承方法,但在这种情况下,您发现它不起作用,但会生成空值。

这表明您的TableViewController实例的继承myDatePicker实例变量为nil

这是对子类化的混淆可能出现的地方。你必须完全不同的对象:第一个是HelloWorldViewController类的实例;第二个是TableViewController类的实例。第二个对象包含本身的一部分其超类HelloWordlViewController的实例变量,这些变量与其他{{1}实例中的任何其他变量 distinct 1}},特别是你的第一个对象......

我的猜测是你的第一个对象有一个非零HelloWordlViewController,而在你的第二个对象中它是零。

1}}实例,类似于:

myDatePicker

HTH,但请记住,这是一个猜测,因为您的问题中没有足够的信息来了解这是否是您的问题。

评论回复

你似乎误解了基本对象&amp;继承模型。您现在已添加到TableViewController

HelloWorldViewController

首先,必须在init方法中初始化您的超类,这通常只是声明:

HelloWorldViewController
如果没有这个,你的实例将无法正确构建。

其次,您似乎正在尝试初始化另一个类的实例变量,因为您正在<{em> @interface TableViewController : NSViewController or NSObject ... @end @implementation TableViewController { HelloWorldViewController *myHelloWorldViewController; // set up in init etc. } - (IBAction)myAddDate:(id)sender { [myHelloWorldViewController addDate]; } ... @end HelloWorldViewController方法中创建-(id) init { HelloWorldViewController *myHelloWorldController = [[HelloWorldViewController alloc] init]; return self; } 的实例并将它分配给一个本地变量,该变量恰好与self = [super init]; 的实例变量具有相同的名称 - 这两个变量没有任何联系(因为在世界上所有被称为“威廉”的人都没有同一个人)。

但是你有一个更大的问题,你的HelloWorldViewController init方法现在调用了HelloWorldViewController的{​​{1}}方法打电话......是的,这是无限的,在你的计算机上意味着直到记忆填满并且你的应用程序死于可怕的死亡。

您可能需要去研究类和实例概念,因为您的代码表明您没有正确理解它们。关于(基于继承的)面向对象概念的任何好文本都应该这样做;这些概念在大多数当前面向对象的语言中基本相同,包括Java和C#。

HTH