Обновить пользовательский интерфейс из другого метода класса - Какао - PullRequest
3 голосов
/ 22 февраля 2011

Я хотел бы обновить пользовательский интерфейс в приложении из AppDelegate, но всякий раз, когда я называю его так:

Controller *object = [[Controller alloc] init];
[object methodHere];

Кажется, пользователь не обновляет пользовательский интерфейс.Что я здесь не так делаю?Я вставил NSLog, чтобы увидеть, вызывается ли он, и это так. Здесь - это пример проекта, который показывает ошибку.

Редактировать: Может кто-то просто показать мне, что нужно изменить в проекте, который я предоставил.Я просто не знаю, что ввести в свой проект, чтобы я мог изменить значение простого NSTextField из другого класса.

Ответы [ 3 ]

9 голосов
/ 22 февраля 2011

Когда вы пишете [[Controller alloc] init], вы не получаете доступ к объекту Controller, который находится в вашем перо.Вы создаете новый объект Controller , который не связан ни с чем другим в вашем приложении.

Помните, что каждый объект Controller не является тем же самым, как каждый NSArray одинаковым.Тот факт, что вы создали один контроллер в своем кончике, который подключен к NSTextField, не означает, что какой-то случайный контроллер, который вы только что создали, совместно использует соединения этого контроллера.

Что вам нужно сделать, это дать делегату ссылку на контроллер, которыйв перо.

4 голосов
/ 24 марта 2011

Это действительно просто, и комментарии Чака в основном объясняют, что вам нужно делать, но я выложу код явно для вас. В testAppDelegate.h:

@interface testAppDelegate : NSObject <NSApplicationDelegate> {
    NSWindow *window;
    // You can make an IBOutlet to any kind of object you
    // want; it's just a way for you to get a reference
    // in code to an object that has been alloc'd and
    // init'd already by the xib mechanism.
    IBOutlet Controller *controller;

}

Затем перейдите в свою XIB в InterfaceBuilder и подключите эту розетку из объекта «Делегировать тестовое приложение» к объекту Controller (эти объекты уже присутствуют в XIB).

В testAppDelegate.m:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // This is the key:
    // _Don't_ alloc/init a new controller object. The 
    // objects in your xib are allocated and initialized 
    // by virtue of being in that file. You just need to 
    // give your AppDelegate a pointer to it, as above.
    [controller setTextValue:@"hello"];
}
3 голосов
/ 22 февраля 2011

Это называется нормально, но не связано с интерфейсом. В вашем файле appDelegate.h должен быть какой-то контроллер вида, вместо этого вызовите метод этого объекта.

Обновление для более подробной информации: Один из способов сделать это - просто сохранить контроллер при его первоначальном создании (и не выпускать его позже.)

Просто поместите свой собственный объект контроллера в ваш .h файл

Controller* myController;

И когда вы создаете новый контроллер представления, к которому хотите перейти, просто установите myController для ссылки на этот объект, а позже, когда вы захотите обновить пользовательский интерфейс, просто вызовите

[myController methodHere];

Немного неуклюже, но это работает. Только не забудьте выпустить myController, когда закончите с этим представлением.

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

-(returnType)callDelegateToDoSomething;

введите это как

-(returnType)callDelegateToDoSomething:(id) sender;

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

[sender methodHere];

и, надеюсь, сработает. (Возможно, вам придется немного поиграть с этим. Я не эксперт по делегатам или аргументам отправителя, но это стоит попробовать.)

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