Какао, Objective-C, как правильно передавать параметры из одного окна в другое - PullRequest
1 голос
/ 16 мая 2011

Я действительно новичок в программировании на Какао / Obj-C.

У меня довольно простое приложение (целевая платформа Mac OSX 10.5 и 10.6), я занимаюсь системным программированием на C / C ++.

У меня есть главное окно с некоторыми текстовыми полями, кнопками, свойствами и т. Д.Я настраиваю розетки и действия (надеюсь, правильно).Дополнительное окно, объявленное в другом NIB, загружается при нажатии одной из кнопок:

- (IBAction) openSettings: (id) sender
{
    ConfigurationWindowController * wc=[[ConfigurationWindowController alloc]     initWithWindowNibName:@"Configuration"];

    [wc showWindow:self];
 }

Загружается новое окно и отображается.

Мне нужно сделать следующие вещи: 1) пройти несколькостроковые параметры второго («дочернего») окна 2) получают эти параметры обратно в главное окно при закрытии второго окна.

Я не уверен, как правильно сделать это в Какао.

@ sergio: Большое спасибо за ваш ответ!В моем «дочернем» окне я сохраняю указатель на главное окно, и перед открытием дочернего окна я передаю несколько параметров:

ConfigurationWindowController * wc=[[ConfigurationWindowController alloc]     initWithWindowNibName:@"Configuration"];
mConfigWindow = wc;

[mConfigWindow setValuesToURL:@"some string here" storageParam:@"another string"     callerWindowPtr:self];
[wc showWindow:self];

Этот метод успешно вызывается. Я вижу значения, хранящиеся в свойствах экземпляра класса «дочернего» окна.,Однако, когда я пытаюсь присвоить это значение текстовым файлам в методе setValuesToURL, элементы GUI по-прежнему равны нулю, я пытался присвоить сохраненные строки в методе awakeFromNib, но здесь эти свойства равны нулю!,Также значение self указателя отличается - это означает, что объект, созданный initWithWindowNibName и фактическое окно с GUI, отличаются.Очевидно, что сохраненный указатель на «Главное» окно также является нулевым, когда я пытаюсь передать обратно значения.Я подозреваю, что проблема в настройке NIB - действительно смущает меня.Я подозреваю, что это общее недопонимание отношений кода и NIB, я пробовал разные вещи, но все еще не могу заставить его работать.Любое руководство было бы действительно полезным.

-(void) setValuesToURL:(NSString*)strServiceURL  storageParam:(NSString*) strStorageURL     callerWindowPtr:(AppletAppDelegate *)_callerWindow
 {
     @try {
          NSLog(@"setValuesToURL was called with params %@ , %@" , strServiceURL     , strStorageURL);
        self.strDataStorageURL = strStorageURL;   
self.strServerURL = strServiceURL;
        self.callerWindow = _callerWindow;
[textServerURL setStringValue:[self strServerURL]];
    [textDataStorageURL setStringValue:[self strDataStorageURL] ];

        NSLog(@" after assigmnemnt  %@ , %@" , [self strDataStorageURL], [self      strServerURL]);

    }
     @catch (NSException * e) {
         NSLog(@"exception inf0 %@  " ,[[ e userInfo]      descriptionInStringsFileFormat]);
    }
    @finally {

    }

}

Хорошая новость - теперь строковые значения назначаются объектам NSTextField.У меня есть кнопка в «дочернем» окне, и при щелчке я пытаюсь перезвонить родительскому указателю в окно methid:

- (IBAction) saveConfigurationSetings: (id) sender
{
    NSLog(@"saveConfigurationSetings: (id) sender");
        //close window and pass back URL strings 
    self.strServerURL =  [textServerURL stringValue]; 
    self.strDataStorageURL = [textDataStorageURL stringValue];
    [self.callerWindow passMeBackData: [textServerURL stringValue] strStorageURLParam:    [textDataStorageURL stringValue]];

    [self close];

}

Здесь переменная callerWindow имеет значение null и passMeBackData завершается ошибкой.Вот объявление в h:

@interface ConfigurationWindowController : NSWindowController {
...
AppletAppDelegate *callerWindow; 
...
}


@property (assign) AppletAppDelegate * callerWindow;

в файле m

@synthesize callerWindow;

1 Ответ

0 голосов
/ 16 мая 2011

Проблема с вашим подходом на самом деле не в том, как это сделать; скорее это то, как вы настроили свои настройки.

Более подходящим потоком для Objective-C / Cocoa, вероятно, будет следующее:

  1. Добавьте ConfigurationWindowController в MainMenu.xib; подключите его к пункту меню ApplicationMenu> Preferences (если память служит, это должно быть возможно просто выполнить с помощью - (IBAction)openPreferences:(id)sender или чего-то в этом роде).

  2. Позвольте пользователю изменять настройки и записывать их в NSUserDefaults по мере их поступления. Вероятно, нет необходимости в модальном окне или кнопках Apply / Cancel / OK, если ваши настройки не являются слишком сложными или их изменение ужасно дорого (в вычислительном отношении).

  3. Либо при каждом изменении параметра, либо при закрытии окна запускаются уведомления о запуске приложения NSNotificationCenter, которые могут наблюдать заинтересованные стороны. Примечание: Не все настройки требуют срабатывания уведомлений; только те, которые влияют на текущие процессы, которые кэшируют значение параметра.

Есть и другие подходы, но это, вероятно, наиболее легко расширяемый.


Если проблема заключается в открытии окна настроек на определенной панели; установить значение тега для каждого элемента управления или пункта меню, который открывает окно соответствующим образом; и проверьте, какую панель вы должны открыть, используя [sender tag].


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...