Установить строку из метода с доступом на уровне класса - PullRequest
0 голосов
/ 18 мая 2011

Я хочу сделать следующее

+(void)DoThis
{
    [textView setString:@"qwertyasdfzxcvb."];
    [textView setNeedsDisplay:YES];
}

Однако, он отказывается установить строку. Потому что это работает,

-(void)DoThis
{
    [textView setString:@"qwertyasdfzxcvb."];
    [textView setNeedsDisplay:YES];
}

Я прихожу к выводу, что строка не может быть установлена ​​в методе с доступом на уровне класса. Так как мне разрешить установку строки из + (void)?

Ответы [ 4 ]

2 голосов
/ 18 мая 2011

Скорее всего, вы пытаетесь установить переменную экземпляра из метода класса. Это не работает, потому что объекты класса не являются экземплярами класса и, следовательно, не могут получить доступ к переменным экземпляра. Итак, ваш метод + (недействительно) DoThis не имеет доступа к переменной textView instance , поскольку объект класса не является instance класса.

2 голосов
/ 18 мая 2011

Вы не можете установить переменную экземпляра из метода класса. Если вы хотите объявить «переменную класса», вы должны создать статическую глобальную переменную внутри файла .m класса, поскольку в Objective-C нет переменных класса. Это статическая переменная C, а не в том смысле, в котором ее рассматривают Java или C #. Здесь «static» гарантирует, что переменная не может быть использована вне этого файла.

2 голосов
/ 18 мая 2011

Предполагая, что textView является переменной экземпляра, нет доступа к ней. В лучшем случае вы можете

+ (void)DoThis:(UITextView*)aTextView {
    [aTextView setString:@"qwertyasdfzxcvb."];
    [aTextView setNeedsDisplay:YES];
}
1 голос
/ 18 мая 2011

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

Эта модельиспользуется во всем какао.Например, NSFileManager имеет метод класса defaultManager, который возвращает общий экземпляр класса.Вы вызываете метод экземпляра для этого общего экземпляра, сначала вызывая defaultManager, поэтому, например, для вызова метода экземпляра isDeletableFileAtPath вы пишете:

[[NSFileManager defaultManager] isDeletableFileAtPath:path]

В вашем случае ваш DoThis становится:

+ (void) DoThis
{
    EvDudeClass *shared = [EvDudeClass sharedInstance];
    [shared.textView setString:@"qwertyasdfzxcvb."];
    [shared.textView setNeedsDisplay:YES];
}

И вам нужно добавить метод sharedInstance в ваш класс.Есть несколько способов сделать это в зависимости от того, как вы хотите использовать свой класс - это одиночка?Вам просто нужен один общий экземпляр и другие не общие?Вы просто хотите поделиться экземпляром, созданным в NIB?Как вы упоминаете IBOutlet, здесь есть реализация, которая выполняет последнее:

static EvDudeClass *privateSharedInstance = nil;

- (void) awakeFromNib
{
    privateSharedInstance = self; // save this instance so it can be shared
    // other init stuff
}

+ (EvDueClass *)sharedInstance { return privateSharedInstance; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...