Объектно-ориентированное программирование (КАК!) - PullRequest
0 голосов
/ 28 августа 2011

Я новичок в объектно-ориентированном программировании. У меня есть два контроллера вида.а и б.в A у меня есть ярлык с именем gradeLabel.Я хочу сделать так, чтобы я мог отображать этот текст в контроллере представления B. Итак, я поместил это:

-(NSString *)grade {
    return [gradeLabel text];
}

Это контроллер представления b

#import "InfoInput.h"
@implementation illRememberViewController
  -(IBAction)previewTheInfo {
      InfoInput *info = [[InfoInput alloc] init];
      gradeText.text = info.grade;
  } 

Но на ярлыке нет текста/ не показывает текст.Как я могу это исправить.Я правильно использую объектно-ориентированное программирование?

Ответы [ 3 ]

3 голосов
/ 28 августа 2011

Во-первых, вам нужно понять объектно-ориентированное программирование.

Как только вы это сделаете, ответом будет «вам нужно либо создать экземпляр, либо взять существующий экземпляр класса, который инкапсулирует grade, и запросить у него grade».

И эта строка кода будет работать:

gradeText.text = thingThatHoldsTheGrade.grade;
<Ч />

Никто не имеет в виду; кратко, может быть, но не намеренно значит. Мы видели этот вопрос - и очень похожие - много, много раз. В конечном счете, это сводится к отсутствию знаний о том, как собрать систему и как ваше приложение интегрируется с инфраструктурой, предоставляемой системой.

Если бы вы пытались построить автомобиль, ваш первый вопрос был бы "Как мне подключить провод к свече зажигания?" Нет. Было бы «Как автомобиль в основном работает, каковы различные подсистемы и как они взаимодействуют?» Тогда «если я хочу сделать автомобиль на заказ, как мне изменить шаблон« базового автомобиля »на то, что я хочу?»

Объектно-ориентированное программирование с помощью Objective-C хорошо, но на самом деле это не базовый учебник, а руководство.

Руководство по программированию приложений для iOS тоже неплохо.

1 голос
/ 28 августа 2011

Когда вы делаете это

InfoInput *info = [[InfoInput alloc] init];

Вы создаете совершенно новый экземпляр, который отличается от того, где вы помещаете некоторый текст в gradeLabel.

Предполагая, что вы, возможно, нажалиcontrollerB из ControllerA ниже кода должен выбрать правильный экземпляр ControllerA.

gradeText.text = [((InfoInput*)self.parentViewController) grade];

Нет необходимости создавать новый экземпляр с помощью [InfoInput alloc] init], удалите эту строку.

0 голосов
/ 28 августа 2011

У вас есть объект класса А? Вы должны ссылаться на это как-то. Пример:

A* a = [[A alloc] init]; 
gradeText.text=a.grade;

Но, похоже, ваш первый класс на самом деле является контроллером представления. В этом случае вы вообще не храните там никакой информации. Обычно вы вводите третий класс, называемый моделью, и просто вызываете его, чтобы дать вам оценку. Читайте, пожалуйста, схему MVC.
[Редактировать] Я бы сохранил информацию о классе в свойстве в вашем UIApplicationDelegeate и прочитал бы оттуда - вам будет намного легче, чем то, что вы делаете сейчас. UIViewController не являются обычными объектами. Обычно объект представляет определенную вещь (скажем, объект TestFForStudentA типа TestResult) и может использоваться как таковой. Тем не менее, UIViewController связаны с пользовательским интерфейсом, который они контролируют (отсюда и их имя), и остаются активными, пока вы используете пользовательский интерфейс - но сложно отслеживать, когда вы переключаете представления и т. Д.

Итак, я бы предложил:
YourAppDelegate.h:

@property (retain) NSString* grade

YourAppDelegate.m:

@synthesize grade;

ViewController A, сохранить значение оценки делегату приложения, как только мы покинем представление

- (void) viewWillDisapper {
   YourAppDelegate* appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
   appDelegate.grade = gradeLabel.text;
}

И, наконец, вы можете показать оценку в ViewController B:

-(IBAction)previewTheInfo {
  YourAppDelegate* appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
  gradeText.text = appDelegate.grade;
} 

Обратите внимание, что это просто для того, чтобы дать вам первую идею. То, что вы действительно хотите, это создать объект, который хранит Grade и переносить этот объект между контроллерами представления

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