Как я могу получить доступ и изменить объект, который объявлен в другом классе? - PullRequest
0 голосов
/ 08 декабря 2010

В моем mainViewController.h я объявил UIButton *myButton, и я синтезировал его в mainViewController.m. Я также создал метод доступа (myButton), который просто возвращает кнопку. В другом представлении (и, следовательно, в другом классе контроллера представления) у меня есть:

mainViewController *mainVC = [[mainViewController alloc] init];
UIButton *myButton = [mainVC myButton];
[eventButton setTitle:@"New Title" forState:UIControlStateNormal];

Я хочу, чтобы этот код изменил заголовок кнопки, но, похоже, он не работает. Используя оператор NSLog (NSLog(@"%@", myButton.titleLabel);), чтобы увидеть, каков текущий заголовок, он всегда возвращает ноль. Из того, что я прочитал, это потому, что я создаю экземпляр mainViewController и, следовательно, на самом деле я не обращаюсь / не изменяю кнопку. Как я могу получить доступ к фактическому контроллеру представления, а не к экземпляру?

Ответы [ 2 ]

2 голосов
/ 08 декабря 2010

(Перед продолжительным обсуждением: похоже, что вы печатаете myButton в одну строку 2 и eventButton в строке 3. Убедитесь, что они совпадают!)

Вы правы, думая, что вы создаете новый экземпляр mainViewController. Чтобы получить тот, который вам нужен, вам нужно будет либо передать ссылку на mainViewController в новый контроллер представления при его создании, написав такой метод:

@synthesize mainViewController;

-(void) initWithMainVC:(MainViewController *)mainVC {
    if ((self = [super init])) {
        self.mainViewController = mainVC;
    }
    return self;
}

для переопределения init, или, если у вас есть ссылка на mainViewController в вашем делегате приложения, вы можете получить его, используя:

MainViewController *mainVC = [(YourAppDelegate *)[[UIApplication sharedApplication] delegate] mainViewController];

В любом случае вы захотите ознакомиться с объектно-ориентированным программированием и указателями в цели C. Когда вы вызываете alloc, вы создаете новую копию этого класса. Все копии находятся в разных частях памяти, поэтому любой новый, который вы делаете (как в вашем коде выше), на самом деле является совершенно другим объектом, например, двумя Приусами или чем-то в этом роде.

Указатель похож на тег имени, который идентифицирует или указывает путь к этому блоку памяти. В приведенном выше примере кода init мы прикрепляем новый тег имени к экземпляру mainViewController с теми же параметрами. То же самое и со второй строкой - мы создаем новый указатель (видите звездочку?), Говорим, что он будет указывать на экземпляр MainViewController, и добавляем этот тег имени или указатель на экземпляр.

(Второй вариант немного сложнее, поскольку вы извлекаете mainViewController из объекта, называемого синглтоном, или объекта, к которому вы можете добраться из любой точки мира ... подробнее об этом и делегате приложения можно узнать на этот пост от Какао с Любовью.)

В любом случае, я нервничаю, рассказывая об этом материале в стеке! Проверьте Apple Objective C справочник для некоторых других основ. Пример кода на iOS Dev Center действительно, действительно хорош для ознакомления. Загрузите проект, который выглядит красиво, или, что еще лучше, просто создайте проект из шаблона XCode и попытайтесь выяснить, как он сшит вместе. Удачи!

0 голосов
/ 08 декабря 2010

Что вам нужно понять, так это то, что когда вы выделяете новый mainViewController *mainVc, вы фактически создаете новый экземпляр контроллера представления и связанной с ним кнопки, поэтому вы изменяете заголовок кнопки, только в данный момент она не та, что в данный момент на вашем экране!

Вы можете либо передать ссылку на mainViewController в соответствии с предложением @Sam Ritchie, либо реализовать метод делегата, который вызывается, когда вы готовы изменить заголовок кнопки.

Скажем, у вас есть кнопка LOGIN, которую вы хотите изменить на LOGOUT, когда пользователь успешно вошел в систему, вы можете создать протокол делегата в контроллере представления, который имеет дело с логикой входа в систему, и реализовать его в контроллере представления, который "владеет" "соответствующий UIButton, где вы можете изменить текст кнопки напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...