从另一个类调用(实例)方法

时间:2011-11-17 00:21:17

标签: objective-c macos cocoa methods

调用方法的方式让我真的很疯狂!不幸的是我在已经提出的问题中找不到它。 我知道如何分配和初始化 但事情是在我的程序中我需要在自己的类中调用该方法 这是一个示例实现,当然我知道我可以用十几个更简单的方式做到这一点,但在我开发的程序中,我有一个非常复杂的情况,我需要这样做

在我的NIB文件中,我有一个标签和两个按钮。 标签和其中一个按钮(称为“设置为今天”)在appDelegate中链接 另一个按钮(称为“设置为十天后”)链接到classTwo 这是所有文件的代码 虽然代码不会产生任何错误,但触发第二个按钮没有任何效果 调用该方法的正确方法是什么。

AppDelegate.h:

    
@interface AppDelegate : NSObject <NSApplicationDelegate>
{
    IBOutlet NSTextField *label;
    NSDate *toDay;
}
-(IBAction)setToToday:(id)sender;
-(void)updateLabelText;
-(void)setToTenDays;

@property (assign) IBOutlet NSWindow *window;
@end

AppDelegate.m:

#import "AppDelegate.h"
@implementation AppDelegate
@synthesize window = _window;
-(IBAction)setToToday:(id)sender
{
    toDay=[NSDate date];
    [self updateLabelText]; 
}
-(void)updateLabelText
{
    [label setStringValue:[NSString stringWithFormat:@"%@",toDay]];
}
-(void)setToTenDays
{
    int secondsPerDay=60*60*24;
    toDay = [NSDate dateWithTimeInterval:10*secondsPerDay sinceDate:toDay];
}
@end

ClassTwo.h

@interface ClassTwo : NSObject
-(IBAction)setToTenDaysLater:(id)sender;
@end

ClassTwo.m

#import "ClassTwo.h"
#import "AppDelegate.h"
@implementation ClassTwo
-(IBAction)setToTenDaysLater:(id)sender
{
    AppDelegate *classOne=[[AppDelegate alloc] init];
    [classOne setToTenDays];
    [classOne updateLabelText];
}
@end

为什么我无法将标签设置为新日期? 两个对象都在NIB文件中,并设置了操作和出口 提前谢谢您的帮助。

P.S。根据我的实际经验,例如我在CustomWindow Class中使用trackpad事件来更改标签。

2 个答案:

答案 0 :(得分:3)

因为在第二课中,你正在创建一个新的AppDelegate实例,而不是调用已经创建的实例。你应该只有一个NSApplicationDelegate。

如果要以编程方式创建ClassTwo,则需要在头文件中从ClassTwo设置ClassOne引用并在NIB中连接它们,或者以编程方式设置它。

编辑:我添加了属性访问者,请务必阅读declared properties

@class AppDelegate;

@interface ClassTwo : NSObject {
   AppDelegate *delegate;
}

@property (assign, nonatomic) IBOutlet AppDelegate *delegate;

- (IBAction)setToTenDaysLater:(id)sender;

@end

ClassTwo.m

#import "ClassTwo.h"
#import "AppDelegate.h"

@implementation ClassTwo

@synthesize delegate;

-(IBAction)setToTenDaysLater:(id)sender {

    [delegate setToTenDays];
    [delegate updateLabelText];
}
@end

然后在ClassOne(AppDelegate)中你可以像这样设置delegate属性:

classTwo.delegate = self;

其中classTwo是XIB中归档实例的IBOutlet,或者您也可以在代码中创建它。

答案 1 :(得分:0)

DisplayView *year = [[DisplayView alloc] initWithNibName:DisplayView bundle:nil];
[self presentModalViewController:year animated:YES];