-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将是nilif myDatePickeris nil-nil在 Objective-C 中允许消息并返回nil

您必须有一个addDate的类实例HelloWorldViewController, 才能使您的第一个测试成功,并且该实例必须具有非 nil 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];

没有这个,您的实例将无法正确构建。

其次,您似乎正在尝试初始化另一个类的实例变量,因为您正在方法HelloWorldViewController 创建实例并将其分配给恰好与实例变量同名的局部变量-这两个变量没有任何联系(因为世界上所有被称为“威廉”的人都不是同一个人)。initHelloWorldViewControllerTableViewController

但是你有一个更大的问题,你HelloWorldViewControllerinit方法现在调用你HelloWorldViewControllerinit方法,它调用......是的,那是无限的,这在你的计算机上意味着直到内存填满并且你的应用程序死于可怕的死亡。

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

高温高压

于 2013-03-14T17:43:21.700 回答