NSButton с двумя функциями - PullRequest
       4

NSButton с двумя функциями

0 голосов
/ 11 сентября 2011

У меня есть NSButton, который загружает файл и анализирует ответ. Я хочу реализовать следующее: Когда я нажимаю на кнопку, он загружает файл и анализирует ответ. Пока это происходит, заголовок кнопок должен измениться с «загрузить» на «отменить», и когда я снова нажимаю на кнопку, когда он загружает или анализирует, процесс анализа или загрузки должен остановиться. Когда процесс был отменен или успешно завершен, заголовок кнопки должен вернуться к «upload», и если я нажму кнопку сейчас, он должен начать с загрузки и повторного анализа. Я надеюсь, вы можете представить, что я имею в виду, английский не мой родной язык;)

Заранее спасибо

Ответы [ 4 ]

1 голос
/ 11 октября 2012

У вас может быть одно подобное действие.

- (IBAction)btnAction:(id)sender {

     NSButton *btn=(NSButton *)sender;

    [btn setTitle:([btn.title isEqualToString:@"Upload"] ? @"Cancel" : @"Upload")];

    if([btn.title isEqualToString:@"Upload"]){
        //Do upload and parsing
    }else{
        //Cancel upload and parsing
    }
}
0 голосов
/ 11 сентября 2011

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


** Чтобы определить, какое действие следует предпринять при нажатии кнопки, просто проверьтедескриптор потока, чтобы увидеть, равен ли он нулю, если это так, то создайте новый поток, в противном случае завершите работу и установите значение nil.(не забудьте установить ноль для начала).

0 голосов
/ 11 сентября 2011

Вы можете переназначить действие вашего NSButton на альтернативный селектор.Допустим, у вас есть два селектора: upload:(id)sender и cancel:(id)sender.

. Сначала настройте свой NIB для вызова селектора upload:.В селекторе upload: вы можете использовать розетку (как упоминал Джошуа), чтобы изменить название кнопки для отмены и затем изменить действие:

- (IBAction)upload:(id)sender {
    [uploadButton setTitle:@"Cancel"];
    SEL cancelSelector = @selector(cancel:);
    [uploadButton setAction:cancelSelector];

    // Carry out upload actions
}

В селекторе cancel: вы можете установитьони возвращаются такими же, какими они были раньше:

- (IBAction)cancel:(id)sender {
    [uploadButton setTitle:@"Upload"];
    SEL uploadSelector = @selector(upload:);
    [uploadButton setAction:uploadSelector];

    // Carry out cancel actions
}

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

0 голосов
/ 11 сентября 2011

Все элементы управления имеют цель и действие.Обычно целью является некоторый объект контроллера.Когда вызывается действие вашей цели (скажем, -multiPurposeButtonClicked:), вы можете изменить некоторое внутреннее состояние вашего контроллера (возможно, BOOL с именем needsUpload) и установить заголовок отправителя (кнопки) или выполнить некоторые другие действия, основанные на этом состоянии.Этот метод может вызывать [self beginProcessingUpload] или [self cancelTheWholeThing] в зависимости от того, needsUpload == YES или нет.Когда происходит обратный вызов «загрузка завершена», вы можете сбросить состояние контроллера и использовать выход для кнопки (может быть, IBOutlet NSButton * uploadButton;), чтобы сбросить заголовок.

Вам решать, как к этому подойти.Более конкретные вопросы получат более сфокусированные ответы.

...