面向对象编程(如何!)

时间:2011-08-28 04:07:31

标签: objective-c xcode

我是面向对象编程的新手,我有两个视图控制器。 a和b。在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 个答案:

答案 0 :(得分:3)

首先,您需要了解面向对象的编程。

一旦你这样做,那么答案就是“你需要实例化或获取封装grade的类的现有实例,并要求grade”。

这行代码可行:

gradeText.text = thingThatHoldsTheGrade.grade;

没有人是卑鄙的;简言之,也许,但不是故意的意思。我们已经看到了这个问题 - 而且非常相似 - 很多很多次。归根结底,它归结为缺乏对系统如何组合以及如何将您的应用程序与系统提供的基础架构集成的知识。

如果您正在尝试制造汽车,您的第一个问题是“如何将电线连接到火花塞?”不会。这将是“汽车如何运作,各种子系统是什么以及它们如何相互作用?”然后“如果我想制作一辆定制汽车,如何将'基本汽车'模板修改为我想要的任何东西?”

Object Oriented Programming With Objective-C很好,但不像指南那样真正是一本基础教程。

iOS Application Programming Guide也很不错。

答案 1 :(得分:1)

当你这样做时

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

您正在创建一个全新的实例,这与您在gradeLabel上放置一些文本的实例不同。

假设你可能已经从ControllerA推送了controllerB,代码应该选择正确的ControllerA实例。

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

无需通过[InfoInput alloc] init]创建新实例,删除此行。

答案 2 :(得分:0)

你有一个A级物体吗?你需要以某种方式引用它。例如:

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

但听起来你的第一堂课实际上是一个视角控制器。在这种情况下,您根本不存储任何信息。你通常会引入一个称为模型的第三类,并且只需要调用它来给你评分。请阅读MVC模式。
[编辑] 我会将等级信息存储在UIApplicationDelegeate的一个属性中并从那里读取 - 这对你来说比你现在正在做的更容易。 UIViewController不是普通对象。通常,Object表示某个Thing(例如,Type TestResult的Object TestFForStudentA)并且可以这样使用。但是,UIViewController链接到它们控制的UI(因此它们的名称)并在您使用UI时保持活动状态 - 但是很难跟踪切换视图的时间等。

所以,我建议:
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的对象,并在视图控制器之间携带该对象