Я новичок в объектно-ориентированном программировании, у меня есть два контроллера представления. а и б. в 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;
  } 

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

-2
user894725 28 Авг 2011 в 08:07

3 ответа

Лучший ответ

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

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, и переносить этот объект между контроллерами представления.

0
Blitz 28 Авг 2011 в 23:42

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

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

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

gradeText.text = thingThatHoldsTheGrade.grade;

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

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

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

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

3
bbum 29 Авг 2011 в 00:50

Когда ты это делаешь

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

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

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

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

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

1
Saran 29 Авг 2011 в 03:56