Передача stringValue TextField из одного класса в другой - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть приложение Какао для Mac OS X, написанное на Xcode 4. У приложения есть главное окно, которое является делегатом приложения. В этом окне есть кнопка, которая открывает другое окно (назовите его всплывающим окном) с 2 полями TextFields и парой кнопок. Когда пользователь нажимает одну из этих кнопок, идея состоит в том, чтобы закрыть всплывающее окно, взять текст из 1-го TextField и использовать его в делегате приложения.

Код, который у меня есть, следующий:

Делегат приложения .h:

@interface TestAppAppDelegate : NSObject <NSApplicationDelegate> {
NSString *valueofedit;
@private
    NSWindow *window;
    NSPersistentStoreCoordinator *__persistentStoreCoordinator;
    NSManagedObjectModel *__managedObjectModel;
    NSManagedObjectContext *__managedObjectContext;
    NSTextField *_StatusLabel;
}

@property (assign) IBOutlet NSWindow *window;
@property (nonatomic, retain) NSString *valueofedit;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (assign) IBOutlet NSTextField *StatusLabel;

- (IBAction)GetStatClick:(id)sender;
- (IBAction)OnLaunch:(id)sender;
- (IBAction)saveAction:sender;

@end

Делегат .m:

#import "TestAppAppDelegate.h"
#import "MyClass.h"

@implementation TestAppAppDelegate
@synthesize StatusLabel = _StatusLabel;
@synthesize valueofedit;
@synthesize window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    valueofedit = [[[NSString alloc] init] autorelease];
}


- (IBAction)GetStatClick:(id)sender {

// I need to get the value of the pop window textfield here.
}


- (IBAction)OnLaunch:(id)sender {

    MyClass *controllerWindow = [[MyClass alloc] initWithWindowNibName:@"pop"]; 
    [controllerWindow showWindow:self];

    // this of course is always null    
    NSString * tmp = [controllerWindow valueofedit];
    NSLog(@"result: %@", tmp);

}

@end

OnLaunch откроет новое окно.

Код всплывающего окна

.h:

@interface MyClass : NSWindowController {
NSString *valueofedit;
@public

    NSTextField *one;
    NSTextField *two;    
    NSWindow *popupwin;
}
@property (assign) IBOutlet NSWindow *popupwin;

@property (assign) IBOutlet NSTextField *one;
@property (assign) IBOutlet NSTextField *two;
@property (nonatomic, retain) NSString *valueofedit;

- (IBAction)onclose:(id)sender;

@end

и .m

#import "MyClass.h"
#import "TestAppAppDelegate.h" //try to access the delegate but no luck

@implementation MyClass
@synthesize popupwin;
@synthesize one;
@synthesize two;
@synthesize valueofedit;

// when we hit the "Done" button
- (IBAction)onclose:(id)sender 
{    
    // the value of the textfield that I need
    valueofedit = [one stringValue];

    // I tried to get the value sent to the app delegate
    TestAppAppDelegate *mainwin = [TestAppAppDelegate alloc];

    [[mainwin valueofedit] initWithFormat:@"%@", valueofedit];
    [popupwin close];    
}
@end

Таким образом, идея заключалась в том, что, поскольку я не могу получить доступ к всплывающему окну напрямую, я попытался сделать переменную общедоступной для делегата приложения и скопировать туда значение текстового поля перед закрытием всплывающего окна. Это не сработало.

Как мне это сделать? Как передать значение текстового поля одного окна другому?

Примечание. Нет, я не могу использовать оповещения для этого.

Примеры кода приветствуются. Спасибо.

1 Ответ

1 голос
/ 26 сентября 2011

Вы выделяете новый экземпляр вашего делегата приложения. Вместо [TestApplicationDelegate alloc] вы должны использовать [NSApp delegate].

Если у вас есть указатель на фактический делегат, вы не используете метод доступа должным образом для установки свойства vauleOfEdit.

В настоящее время вы вызываете initwithformat для возвращенного значения метода доступа, который будет либо нулевым, либо уже инициализированной строкой.

Измените ваш onclose метод на:

// when we hit the "Done" button
- (IBAction)onclose:(id)sender 
{    
    TestAppAppDelegate *mainwin = (TestAppAppDelegate*)[NSApp delegate];

    mainwin.valueofedit = [one stringValue];
    [popupwin close];    
}
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...