Я новичок в объектно-ориентированном программировании, у меня есть два контроллера представления. а и б. в 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 ответа
У вас есть объект класса А? Вам нужно как-то сослаться на это. Пример:
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, и переносить этот объект между контроллерами представления.
Во-первых, вам нужно понять объектно-ориентированное программирование.
Как только вы это сделаете, ответ будет такой: «вам нужно либо создать, либо получить существующий экземпляр класса, который инкапсулирует grade
, и запросить у него grade
».
И эта строка кода будет работать:
gradeText.text = thingThatHoldsTheGrade.grade;
Никто не злится; возможно, кратко, но не намеренно. Мы видели этот вопрос - и очень похожие - много-много раз. В конечном итоге все сводится к незнанию того, как устроена система и как ваше приложение интегрируется с инфраструктурой, предоставляемой системой.
Если бы вы пытались построить автомобиль, ваш первый вопрос был бы: «Как подключить провод к свече зажигания?» Нет. Это было бы «Как в основном работает автомобиль, каковы различные подсистемы и как они взаимодействуют?» Затем «если я хочу сделать автомобиль на заказ, как мне изменить шаблон« базовый автомобиль »на все, что я хочу?»
Объектно-ориентированное программирование с помощью Objective-C это хорошо, но на самом деле это не просто базовый учебник, а скорее руководство.
Руководство по программированию приложений iOS - это тоже неплохо.
Когда ты это делаешь
InfoInput *info = [[InfoInput alloc] init];
Вы создаете совершенно новый экземпляр, это не тот экземпляр, в который вы помещаете текст в GradeLabel.
Предполагая, что вы могли нажать ControllerB из ControllerA, приведенный ниже код должен выбрать правильный экземпляр ControllerA.
gradeText.text = [((InfoInput*)self.parentViewController) grade];
Нет необходимости создавать новый экземпляр с помощью [InfoInput alloc] init], удалите эту строку.
Похожие вопросы
Новые вопросы
objective-c
Этот тег следует использовать только для вопросов, касающихся функций Objective-C или зависящих от кода на языке. Теги [cocoa] и [cocoa-touch] следует использовать, чтобы узнать о фреймворках или классах Apple. Используйте связанные теги [ios], [macos], [apple-watch] и [tvos] для проблем, характерных для этих платформ.