Хобрук: Ваш путь к мастерству в программировании

WindowControllers, IBOutlets и объектно-ориентированное программирование?

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

Вот оно. У меня есть приложение какао, которое создает как главное окно, так и главный контроллер приложения в mainMenu.xib. Мой объект myMainAppController содержит другой windowController, скажем, mySubWindowController, который инициируется из собственного отдельного файла пера, как показано ниже. Допустим, у subWindow есть два элемента, возможно, NSTextfield и NSButton. Так...

myMainAppController.h
@interface
   @property (strong) MySubWindowContorller *mySubWindowController;
   ........ so forth


MyMainAppController.m
@implementation
 ......
 self.mySubWindowController = [MySubWindowController alloc] initWithWindowNibName:
 @"mySubWindow"];  
 etc...


MySubWindowController.h
@ interface
  IBOutlet (weak) NSTextfield *myTextField;
  IBOutlet (weak) NSButton *myButton;
....

Пока все хорошо, я думаю. Довольно стандартные вещи, не так ли? Итак, суть моего вопроса. В этой структуре моего класса, как я могу получить любую информацию или действия, которые происходят в подокне, обратно в мой mainAppController и данные из mainAppController в подокно? Кажется, я не могу сделать IBOutlet или IBAction из текстового поля/кнопки обратно в myMainAppController.h, поэтому, кроме использования KVO, как myMainAppController получит какую-либо информацию от mySubWindowController? Что, если есть действие, реализованное в подокне, для которого требуются элементы myMainWindowController? Я не могу отправить сообщение о действии обратно в myMainAppController, а mySubWindowController не имеет доступа к другим элементам содержащего его класса. Я полагаю, что мог бы объявить и определить мягкие указатели необходимых элементов в myMainAppController на mySubWindowController, но это почему-то похоже на нарушение «объектно-ориентированности» и локализации.

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

Заранее спасибо за любые мысли.


  • Я думаю, вам нужно изучить, как работают делегаты в Objective-C: developer.apple.com/library/ios/documentation/general/ 30.09.2013
  • Я не уверен, что вы делаете это правильно. Ваш контроллер подокна обрабатывает представление внутри основного контроллера? Затем вы должны добавить «Custom View» в свой xib и позволить IB создать экземпляр класса. Или это другое окно? Затем вы должны создать xib для другого окна и позволить IB создать экземпляр объекта контроллера. 30.09.2013
  • Нет, мой subWindowController не обрабатывает вид в главном окне. Это отдельное окно в собственном файле пера. Я создаю экземпляр объекта subWindowController внутри mainAppController, используя initWithWindowName. Я полагаю, что мог бы создать экземпляр subWindowController в IB вместе с его окном, но тогда разве это не оставит меня с двумя оконными контроллерами, у которых нет никакого доступа друг к другу? 30.09.2013
  • Спасибо всем за помощь. Я разобрался со всей концепцией пользовательских делегатов, и теперь все выглядит намного чище! 04.10.2013

Ответы:


1

Для этого вам нужно написать свои собственные делегаты. Надеюсь, приведенный ниже код поможет вам. В нем есть два оконных контроллера, скажем, AwindowController и BwindowController. Если в AwindowController произошло какое-либо действие, то BwindowController узнает об этом. Например, я создал одну кнопку в AwindowController, если мы нажмем на эту кнопку, тогда BwindowController получит некоторые сообщения или данные, когда кнопка нажмет на AwindowController. Таким образом, вы можете отправить любые данные или строковое значение в зависимости от того, что вы хотите отправить. Примечание. Пользовательские делегаты были написаны в BWindowController.

#import "sampleDelegate.h"
#import <Cocoa/Cocoa.h>
#import "BWindowController.h"

@interface AWindowController : NSWindowController<sampleDelegate>

{
    NSString *text;
}
@property(readwrite,retain)NSString *text;
-(IBAction)doSet:(id)sender;

@end

#import "AWindowController.h"
#import "BWindowController.h"

@interface AWindowController ()

@end

@implementation AWindowController
@synthesize text;


- (id)initWithWindow:(NSWindow *)window
{
    self = [super initWithWindow:window];
    if (self) {
        // Initialization code here.
    }

    return self;
}

-(NSString*)getDataValue
{
    return @"Button clicked on AWindow";
}

- (void)windowDidLoad
{
    [super windowDidLoad];

    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
}

-(NSString*)windowNibName
{
    return @"AWindowController";
}

-(IBAction)doSet:(id)sender
{
    [self setText:[self text]];
    BWindowController *b=[[BWindowController alloc]init];
    b.delegate=self;
    [b showWindow:self];
}
@end

#import <Cocoa/Cocoa.h>
#import "sampleDelegate.h"

@protocol sampleDelegate <NSObject>
@required
-(NSString *)getDataValue;
@end
@interface BWindowController : NSWindowController<sampleDelegate>
{
    NSString *bTextValue;
    id<sampleDelegate>delegate;
}
@property(readwrite,retain)NSString *bTextValue;
@property(readwrite,assign)id<sampleDelegate>delegate;
@end

#import "BWindowController.h"
@interface BWindowController ()

@end

@implementation BWindowController
@synthesize bTextValue,delegate;
- (id)initWithWindow:(NSWindow *)window
{
    self = [super initWithWindow:window];
    if (self) {
        // Initialization code here.
    }

    return self;
}
-(NSString *)getDataValue
{
    return nil;
}
- (void)windowDidLoad
{
   NSString *str= [[self delegate]getDataValue];
    [self setBTextValue:str];
    [super windowDidLoad];

    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
}

-(NSString*)windowNibName
{
    return @"BWindowController";
}
@end
30.09.2013
  • Спасибо всем за помощь. Я разобрался со всей концепцией пользовательских делегатов, и теперь все выглядит намного чище! 04.10.2013

  • 2

    Если имеется только один mainAppController, следует использовать шаблон singleton. Создайте метод +getSingleton() для доступа к экземпляру singleton из любого места. NSApplication также использует шаблон singleton, см. +sharedApplication().

    Обсуждение шаблона singleton в контексте target-c можно найти здесь: https://developer.apple.com/library/ios/documentation/general/conceptual/DevPedia-CocoaCore/Singleton.html.

    Если по какой-то причине вы не можете использовать паттерн singleton, вам нужна ссылка из окна обратно на mainAppController. Для этого снимите флажок в IB для автоматического создания экземпляра подокна. Вместо этого реализуйте awakeFromNib в своем mainAppController и создайте экземпляр подокна самостоятельно, передав ему указатель на mainAppController.

    01.10.2013
    Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

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

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..