2012-12-02 5 views
1

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

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

Как я могу ссылаться на этот класс? И что более важно, какой должен быть правильный способ? Должен ли я расширять класс NSWindow, чтобы я мог получить экземпляр NSWindow, который может управлять окном, содержащим таблицу (а затем вызвать метод)?

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

PS: Я знаю, что есть тонны Documentations файлов, но мне нужно 2 жизни, чтобы сделать все, что я хотел бы, чтобы я думал, что я могу использовать некоторую помощь просить здесь :)

+0

У вас есть 'NSWindowController', чтобы управлять окнами ? У вас всегда может быть несколько экземпляров в вашем переднем контроллере для управления несколькими окнами. – TheAmateurProgrammer

ответ

2

Проблема заключается в том, что этот метод находится внутри класса, реализующего протокол NSTableViewDataSource.

Как я могу ссылаться на этот класс?

Эти два предложения не имеют смысла, но я думаю, что понимаю, к чему вы клоните.

Вместо подкласса NSWindow поместите логику управления окна импорта, включая методы NSTableViewDataSource, в класс контроллера. Если контроллер соответствует окну, вы можете подклассифицировать NSWindowController, хотя вам этого не нужно.

Вы можете реализовать -importData: в качестве IBAction в делетете приложения, а затем подключить селектор элемента к importData: on First Responder. Этот метод должен создать экземпляр контроллера окна импорта и загрузить окно из наконечника.

В вашем контроллере -awakeFromNib или -windowDidLoad вашего окна окна импорта вызывается метод, который обновляет данные.

Добавлено:

Вот образец, который я предложил бы использовать в делегат своего приложения:

@property (retain) ImportWindowController *importWC; 


- (IBAction) showImportWindow:(id) sender { 
    if (!self.importWC) 
     self.importWC = 
     [[ImportWindowController alloc] initWithWindowNibName:@"ImportWindow"]; 
    [self.importWC refreshData]; 
    [self.importWC.window makeKeyAndOrderFront:sender]; 
} 
+0

Hi noa, спасибо за ответ. То, что я уже сделал, более или менее то, что вы говорите. Проблема в том, что я не могу реализовать метод '-importData' в делетете приложения, потому что этот метод также должен обновлять данные в моей таблице, даже когда окно уже загружено, поэтому я не могу просто полагаться на обновление данных при загрузке окно. – Eux

+0

Чтобы обновить данные в таблице, мне нужен доступ к массиву, содержащему данные, а затем доступ к экземпляру tableView для вызова метода '-reloadData'. Вот почему я говорил о ссылке на экземпляр класса контроллера. Ссылка, которая создается при загрузке окна и автоматически создает экземпляр класса делегата для управления таблицей. – Eux

+0

Получил это. В этом случае вам нужен такой метод, как '-refreshData' в общедоступном интерфейсе вашего контроллера окна импорта - это объект, который должен иметь ссылку на tableview. – paulmelnikow

Смежные вопросы