Pergunta

Eu tenho um menu que tem um item para cada valor em uma enumeração.

O menu:

[ ] Sort by Due Date
[ ] Sort by Priority
[√] Sort by Title

A enumeração:

typedef enum  CW_TASK_SORT_METHOD {
    CWTaskSortMethodDueDate,
    CWTaskSortMethodPriority,
    CWTaskSortMethodTitle
} CWTaskSortMethod;

A propriedade:

@property(readwrite, assign) CWTaskSortMethod taskSortMethod;

O que é a forma mais limpa para conectar isso? Eu tenho duas idéias, mas ambos me parece insatisfatória.

1º ideia: criar propriedades para cada valor (sortMethodIsDueDate, setSortMethodIsDueDate: etc) Essas propriedades chamaria setTaskSortMethod: e chamar valueDidChange:@"sortMethodIsDueDate" etc. Os itens do menu seria então se ligam a essas propriedades. Este parece ser um monte de trabalho.

2ª ideia: Conecte cada item de menu para -(IBAction)updateSortMethod:(id)sender que poderia então iterar os itens de menu e definir o valor dependendo sender. Esta abordagem é bem até taskSortMethod é alterada por uma seção diferente do código a que as necessidades de código ponto a ser adicionado para manter o menu em sincronia com taskSortMethod.

estou inclinado para a primeira abordagem, uma vez que tem uma melhor separação entre a V & C.

Qualquer idéias melhores?

Foi útil?

Solução

Eu acho que você está no caminho certo com a sua segunda ideia, mas há algo a considerar:

NSMenu / NSMenuItem não tem um conceito de "item selecionado" como NSPopupButton por exemplo. Eu usaria o mecanismo target / ação para mudar a validação do método de classificação e menu ( Introdução ao User interface Validação ) ou mesmo o NSMenu método delegado -menu: UpdateItem: atIndex: shouldCancel: ( NSMenuDelegate Protocolo de Referência ) para atualizar o estado do item com base no resultado de -taskSortMethod.

Uma vez que os itens do menu só precisa ser atualizado quando eles são mostrados (que este mecanismo faz para você), você não precisa se preocupar em atualizar os itens de menu a si mesmo quando -taskSortMethod muda para outro lugar.

Ex:

[sortByDueDateMenuItem setState: ([self taskSortMethod] == CWTaskSortMethodDueDate) ];

IMO, isso é muito mais limpo do que tentar sobre-projetar uma solução ligações de potência.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top