2013-04-11 3 views
0

Эй, я очень новичок в программировании Objective C, и я застрял. Когда я создаю функцию I, он не может использовать переменные, которые я создал для ярлыков или текстовых просмотров, и т. Д. И всякий раз, когда я вызываю их в функции viewDidLoad, я должен делать либо self (переменное имя), либо _ (variableName) и это не позволит мне сделать это за пределами функции viewDidLoad. Есть ли способ доступа к ним за его пределами?Как использовать переменные, созданные за пределами viewDidLoad

ответ

0

Похоже, что вы используете авторизованное свойство. Используя свойство Auto Synthesized, вам не нужно @shtesize объектов. @sythesize object = _object; будет неявно реализовываться в этом случае.

Таким образом, вы можете получить доступ к объекту, используя self.object или _object.

Вы можете @synthesize, чтобы избежать использования объектов через self.varName или _varName. Вы можете напрямую использовать его с помощью varName.

+0

Я использую MKMapView, и я создал MKCoordinateRegion глобальную переменную, и я меняю ее атрибуты в IBAction, вызываемые UISlider, но он не изменяется в симуляторе? Есть ли что-то, что мне нужно сделать, чтобы перезагрузить карту? –

1

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

С одной стороны, необходимо провести различие между функции и метода экземпляра. В Objective-C классы могут иметь переменные экземпляра (переменные, которые являются частью экземпляра этого класса) и методы экземпляра (аналогичные функциям, связанным с экземпляром этого класса). Классы также могут иметь свойства, которые используются скорее как переменные экземпляра, поскольку они являются значениями, связанными с объектом, но к ним обращаются через методы доступа. Функции, с другой стороны, не являются частью какого-либо класса. Таким образом, класс имеет интерфейс, где переменные экземпляра и методы объявляются, как это:

@interface Person : NSObject 
{ 
    NSString *firstName; 
    NSString *lastName; 
} 

@property (readonly) NSString *fullName; 
@property (strong) NSArray *friends; 
@property (assign) int age; 

- (id)initWithFirstName:(NSString*)first lastName:(NSString*)last; 
- (void)addFriend:(Person*)friend; 

@end 

А также реализация, как это:

@implementation Person 

- (id)initWithFirstName:(NSString*)first lastName:(NSString*)last 
{ /* code goes here */ } 

- (void)addFriend:(Person*)friend 
{ /* code goes here */ } 

- (NSString *)fullName 
{ return [NSString stringWithFormat:@"%@ %@", firstName, lastName; } 

@end 

Эти вещи в реализации являются методы экземпляра, так как обозначенные - в начале и тот факт, что они определены в блоке @implementation. (Если у них были + вместо -, они были бы методами класса вместо методов экземпляра - я дам вам прочитать об этом в документах.) Доступ к свойствам осуществляется путем вызова соответствующих методов доступа, используя либо обычные вызовы метода, либо точку нотации, поэтому если у вас есть:

Person *george = [[Person alloc] initWithFirstName:@"George" lastName:@"Bailey"] 

все они действительны:

NSString *name1 = george.fullName; 
NSString *name2 = [george fullName]; 
george.age = 45; 
[george setAge:45]; 
int years1 = george.age; 
int years2 = [george age]; 

Кроме того, self указатель на "текущий объект". Вы можете использовать его в методах экземпляра, чтобы объекты могли вызывать свои собственные методы и получать доступ к своим собственным свойствам. Например, Person класс может содержать метод, как это:

  • (NSString *) nameAndAge { NSString * nameAndAge = [NSString stringWithFormat: @ "% @:% D", self.fullName, сам.возраст]; }

функции, с другой стороны, не являются частью любого класса, синтаксиса функции использования C, а не Синтаксис метода Objective-C, и не определены в блоке @implementation:

BOOL isMiddleAged(Person* person) 
{ 
    return (person.age > 30) && (person.age < 60); 
} 

Вы не можете использовать функцию self в функции, потому что функция не связана с объектом, поэтому нет ничего для self, чтобы указать на. Однако вы можете использовать свойства других объектов, о которых вы знаете, например, person.age в приведенном выше примере.

И всякий раз, когда я называю их в функции viewDidLoad, я должен сделать либо самостоятельно. (ИмяПеременный) или _ (имяПеременный), и это не будет позволять мне делать , что за пределы функции viewDidLoad.

Вы должны иметь доступ к свойствам вашего контроллера вида. Как объяснялось выше, self.(variableName) - это способ доступа к свойствам. _(variableName) относится к переменной (часто генерируемой компилятором), которая хранит значение свойства. (Обычно вы не должны обращаться к этим переменным непосредственно за пределами методов инициализации, а -dealloc - вместо этого используйте аксессоры свойств.) Эти свойства можно использовать в любом методе класса, а не только -viewDidLoad. Вы также можете получить доступ к свойствам других объектов, заменив self на имя указателя на объект, как и в случае с person в isMiddleAged().

Смежные вопросы