Как получить доступ к ivar из метода класса другого файла реализации

Как получить доступ к свойствам (название, состояние и т. д.) переменных экземпляра из метода класса другого файла реализации? Я попробовал @synthesize, но не смог заставить его работать. Чтобы быть более точным; Мне нужно получить доступ к IBOutlets класса NSWindowController.


person David Bleu    schedule 01.04.2010    source источник


Ответы (3)


Прежде всего, вы должны прочитать эту главу раньше.

Введение в язык программирования Objective-C.

Что именно вы хотите знать. Очевидно, что вы не можете получить доступ к переменной экземпляра без экземпляра. Метод класса — это статический метод (сообщение), к которому вы можете получить доступ без какого-либо экземпляра объекта. Не могли бы вы уточнить свой вопрос, Дэвид?

person Vincent Zgueb    schedule 01.04.2010
comment
Спасибо за ответ. Чтобы быть более точным; У меня есть NSWindowController с IBOutlets, и мне нужно получить доступ к их состоянию/заголовку/... из метода класса другого файла реализации. Это метод класса, потому что он вызывается из еще одного файла. Я мог бы просто сохранить его с помощью метода экземпляра в исходном файле, но я подумал, если я могу получить доступ к выходам, почему бы мне все равно не переместить весь метод в его собственный класс? - person David Bleu; 01.04.2010
comment
Для меня это неясно ... Вы согласны с концепцией методов класса и экземпляра, свойств и средств доступа? Я предполагаю, что вы пытаетесь получить доступ к некоторым данным, инкапсулированным в одном объекте, из другого, но слова, которые вы используете, неясны («вызывается из другого файла»). Файл не имеет ничего общего с областью видимости переменных. Вы понимаете, что я имею в виду, Дэвид? - person Vincent Zgueb; 01.04.2010

Хорошо, тогда вам просто нужно объявить свои свойства в интерфейсе класса. Ваши переменные экземпляра имеют префикс IBOutlet, чтобы указать, что они должны быть установлены с помощью пера. Может быть, вы уже знаете все эти вещи. Извините в таком случае.

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -    
  MyClass.h file
*/
@interface MyClass
{

// instance vars
IBOutlet NSString *title; // Do you have this ? Should be bind in IB.
}

// and this to declare the accessors as public methods
@property (nonatomic, retain) NSString *title;

/*
other methods signature declaration
*/
@end
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -    
  MyClass.m file
*/
@implementation MyClass

@synthesize title; // allow to generate the accessors of your property

/*
methods implementation here
*/

@end

Если вы создаете экземпляр своего класса, просто вызовите метод доступа [myObjectOfMyClass title]. Возможно, вы увидите шаблон проектирования singleton, который является одним из наиболее часто используемых и полезных для простого извлечения экземпляра объекта, который должен быть уникальным. Как выглядит ваш синглтон Objective-C?

Винсент Згеб

person Vincent Zgueb    schedule 01.04.2010

Я обычно использую свой контроллер приложения в качестве посредника для вещей, которые мне нужны, доступными во всех моих классах… предполагая, что ваш контроллер приложения также является делегатом вашего приложения. Из любого класса я могу получить доступ к своему контроллеру приложения (делегат приложения), используя [делегат NSApp].

Имея это в виду, я удостоверяюсь, что мой appcontroller создает экземпляры таких вещей, как оконные контроллеры. Затем, если мне нужно получить доступ к оконному контроллеру, я создаю для него переменную экземпляра в своем контроллере приложения, а затем создаю метод доступа для этой переменной экземпляра. Например:

в appcontroller.h:

MyWindowController *windowController;
@property (readonly) MyWindowController *windowController;

в appcontroller.m:

@synthesize windowController;

Затем из любого класса я могу получить доступ к этому экземпляру оконного контроллера, используя:

MyWindowController *windowController = [[NSApp delegate] windowController];
person regulus6633    schedule 01.04.2010
comment
Я вижу, у вас есть следующее... Ваше решение выглядит хорошо, но я продолжаю получать предупреждение "MyWindowController" может не отвечать на "-myView"... это потому, что вам нужно импортировать файл .h appcontroller в класс, где вы " повторный доступ к этому методу, т.е. #import AppController.h - person regulus6633; 03.04.2010
comment
Кстати, вам также придется импортировать файл .h оконного контроллера, чтобы он знал о классе MyWindowController. - person regulus6633; 03.04.2010