цель c доступ к общедоступному методу

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

Class1.h

@interface anything : NSObject {

    IBOutlet NSTextField *label;

}

+ (void) setLabel:(NSString *)string;
- (void) changeLabel:(NSString *)string2;

Класс1.м

+ (void) setLabel:(NSString *)string {

    Class1 *myClass1 = [[Class1 alloc] init];

    [myClass1 changeLabel:string];
    NSLog(@"setLabel called with string: %@", string);

}

- (void) changeLabel:(NSString *)string2 {

    [label setStringValue:string2];
    NSLog(@"changeLabel called with string: %@", string2);
}

Class2.m

- (IBAction)buttonPressed {

    [Class1 setLabel:@"Test"];

}

Очень странно, что в NSLogs все нормально, в обоих NSLogs строка "Test", но stringValue textField не меняется!


person Vincent Friedrich    schedule 21.12.2012    source источник
comment
Вы перепутали методы класса и объекта. Этот пример действительно не имеет смысла. Вы просто временно создаете объект в + setLabel:, но никогда с ним ничего не делаете / никогда не возвращаете его. Скажи мне, что ты хочешь сделать, чтобы я мог тебе помочь.   -  person IluTov    schedule 21.12.2012
comment
Почему используется статический метод? Это синглтон?   -  person Ramy Al Zuhouri    schedule 21.12.2012
comment
@RamyAlZuhouri Нет, это не синглтон, для этого потребуется статическая переменная.   -  person IluTov    schedule 21.12.2012
comment
Да, теперь я это хорошо понимаю, он выделяет новый экземпляр класса: бессмыслица.   -  person Ramy Al Zuhouri    schedule 21.12.2012


Ответы (4)


Вот краткий пример того, что вы можете сделать:


Пользовательский класс

@interface ITYourCustomClass : NSObject
@property (strong) NSString *title;

- (void)doSomethingWithTheTitle;
@end

@implementation ITYourCustomClass
- (void)doSomethingWithTheTitle {
    NSLog(@"Here's my title: %@", self.title);
}
@end

Используй это

@implementation ITAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    ITYourCustomClass *objectOfYourCustomClass = [[ITYourCustomClass alloc] init];
    [objectOfYourCustomClass doSomethingWithTheTitle];
}

@end

Методы классов и объектов

Объявление метода с помощью + означает, что вы можете вызывать метод непосредственно в классе. Как вы сделали это с [myClass1 setLabel:@"something"];. В этом нет смысла. Вы хотите создать собственность. Свойство сохраняется в объекте, поэтому вы можете создать объект ITYourCustomClass *objectOfYourCustomClass = [[ITYourCustomClass alloc] init]; и установить свойства objectOfYourCustomClass.title = @"something". Затем вы можете вызвать [objectOfYourCustomClass doSomethingWithTheTitle];, который является общедоступным методом объекта.

person IluTov    schedule 21.12.2012
comment
хорошо .. Я думаю, что у меня что-то не так с этими + и - Я новичок в разработке для Mac, я разрабатываю приложения для iPhone уже 2 года. Я подключил Class1 и Class2 к двум различным загруженным файлам пера, один из которых содержит метку, а другой - текстовое поле, я просто хочу изменить метку в одном окне с текстовым полем в другом окне. В примере, который вы мне дали, я получаю то же самое, что и раньше: NSLogs дают мне измененный заголовок, но сама метка не меняется, если я вызываю -doSomethingWithTheTitle из другого класса - person Vincent Friedrich; 21.12.2012
comment
@VincentFriedrich Так как же использовать Class1 и Class2 в Интерфейсном Разработчике? Обычно у вас есть контроллер представления или контроллер окна, с помощью которого вы управляете такими вещами. Или вы можете добавить объекты для их соединения, как класс AppDelegate в исходном файле пера. - person IluTov; 21.12.2012
comment
да, я добавил объект и назвал его Class1 и управлял всем оттуда. В windowController я ничего не делаю .. это моя первая попытка в приложении для Mac. Я сделал это с объектом, потому что у меня было несколько проблем с использованием nsviewcontroller или windowcontroller. - person Vincent Friedrich; 21.12.2012
comment
Вы подключили текстовое поле к розетке в своем ИБ? - person IluTov; 21.12.2012
comment
@VincentFriedrich. Есть ли у вас шанс опубликовать его на Github? Найти такую ​​ошибку действительно сложно. - person IluTov; 21.12.2012

- и + не означают публичное или частное

- обозначает методы, которые вы можете вызывать для объектов класса и

+ обозначает методы, которые могут быть вызваны в самом классе.

person Infinite    schedule 21.12.2012
comment
ааа ладно .. это отличается от java или я что-то понял не так? - person Vincent Friedrich; 21.12.2012
comment
в target-c в основном нет частных функций ... каждая функция, определенная в заголовке, является общедоступной ... если вы все еще хотите определить частные функции, чтобы они где-то упоминались, вы добавляете блок в свой .m, как описано в stackoverflow.com/a/651852/232812 - person Infinite; 21.12.2012
comment
Хороший ответ, хотя технически это методы, а не функции. - person jlehr; 21.12.2012
comment
Другими словами, + означает статический, а - означает нестатический - person Nicolas Tyler; 06.11.2013

Вы пытаетесь получить доступ к переменной экземпляра с помощью метода класса. Вы должны преобразовать метод +setLabel: в -setLabel: и вызвать его так:

[_myClass1Variable setLabel:@"Test"];

Кроме того, что -setStringValue? Если вы просто пытаетесь изменить текст UILabel, вам нужно позвонить -setText:.

person nikolovski    schedule 21.12.2012

Я предполагаю, что label будет NSTextField, и вы пытаетесь установить его значение без загрузки этого XIB, в результате чего ваш awakeFromNib не вызывается. И розетка не будет привязана к тому, что label.

person Anoop Vaidya    schedule 21.12.2012