对象类的正确用途是什么?

时间:2014-05-03 06:14:14

标签: ios objective-c cocoa-touch

我的视图控制器正在保存我的对象属性和iVars等。它们根本不应该保留任何内容。

**为了清晰起见,本文的其余部分已经过大量编辑。 **

我的类对象使用NSBum给出的示例,该示例试图显示由一种方法处理的数据,能够继续在另一种方法中使用。

#import <Foundation/Foundation.h>
@interface MYEmployee : NSObject

@property (nonatomic, strong) NSString *firstName;

@end

现在我的VC界面文件

#import <UIKit/UIKit.h>
#import "MYEmployee.h"

@interface MYEmployeeDetailViewController : UIViewController

@property ( nonatomic,strong) MYEmployee *employee;  // as suggested

// UI elements
    // a button that picks up from a textfield
- (IBAction)getName:(UIButton *)sender;

@property (strong, nonatomic) IBOutlet UITextField *inputField;

    // a button that puts the names in a label
- (IBAction)showName:(UIButton *)sender;

@property (strong, nonatomic) IBOutlet UILabel *employeeNameLabel;

    // a second label shows how i've been doing it so far
@property (strong, nonatomic) IBOutlet UILabel *contractorNameLabel;


@end

以及我在VC实施文件中的相关要点,其中我使用了VC的私人承包商属性。

#import "MYEmployeeDetailViewController.h"

@interface MYEmployeeDetailViewController ()
@property (nonatomic, strong) NSString *contractor; 
@end

@implementation MYEmployeeDetailViewController


// MYEmployee *employee; // use of an iVar has no effect


- (IBAction)getName:(UIButton *)sender {
    // MYEmployee *employee = [[MYEmployee alloc] init]; // no effect except only within the method
    // employee.firstName = self.inputField.text;        // 

    self.employee.firstName = self.inputField.text;      // class object picks up text from a textField
    self.contractor = self.inputField.text;              // self does exactly the same
    }

- (IBAction)showName:(UIButton *)sender {
    // MYEmployee *employee = [[MYEmployee alloc] init];     // resets contents of the iVar to nil
    // self.employeeNameLabel.text = employee.firstName;     // 

    self.employeeNameLabel.text = self.employee.firstName;   // no joy using the property in .h file as suggested

    self.contractorNameLabel.text = self.contractor;         // this actually displays the text
    }

@end
当承包商出现工作时,不应该看到员工(典型的是,我们称他们为“水泡”,他们只在工作完成时出现;)

回到严肃的事情,[alloc [init]]和iVar线被注释掉,因为它们没有效果,但为了完整起见,无论如何都留下了。我不认为我应该编辑标题,但我的quandry或多或少是相同的“..为什么我不能仅仅将模型用作自我的替代?”毕竟,我将功能外包

2 个答案:

答案 0 :(得分:1)

我可能会尝试在某种程度上缩小问题的重点;但我会对我认为的问题采取行动:

  

我的视图控制器正在保存我的对象属性和iVars等。   他们不应该持有任何东西。

如果您遵循良好的MVC原则,那么您的视图控制器不应具有更准确属于模型层的属性。但鉴于视图控制器是模型和视图之间的管道,控制器上的某些暴露属性是必不可少的。

假设您有一个视图控制器,它显示有关员工的详细信息 - 名字,姓氏,工资,部门等。您可能需要一个代表该员工的模型对象。我们称之为MYEmployee。接下来考虑其他类需要了解的MYEmployee实例。这些是类接口中公开的属性。

现在,我们的控制器如何使用MYEmployee的实例?在这里,视图控制器 - 让我们称之为MYEmployeeDetailViewController - 需要知道要显示的员工,因此我们需要在视图控制器的界面中公开所代表的员工,例如

@property (nonatomic, strong) MYEmployee *employee;

现在MYEmployeeDetailViewController班级用户可以传递员工进行展示。

  

然后如何使用我想象的类对象?

我认为你的不确定性围绕着诸如“谁拥有什么数据?”等问题。等我的建议是退后一步,真正阅读Apple关于MVC的文档,并利用一些资源面向对象设计。它总是帮助我首先考虑接口(类接口,而不是UI)而不是实现。在编码之前映射出类之间的关系也有帮助。

答案 1 :(得分:0)

您应该在新的init对象myClass上致电item,而不是仅为alloc致电初学者。我怀疑你真的只需要分配内存但实际上没有初始化对象。

除此之外,你的问题有点难以理解。您使用对象来封装数据,然后将该数据公开给可能需要它的其他对象。视图控制器将具有处理视图的对象和处理数据的对象。控制器将从数据对象中获取所需内容,并根据需要将其传递给查看对象。通过这种方式,控制器将自己保存数据模型(如果您正在进行适当的MVC设计)。

你说你希望你的类对象在方法之间保存数据:那就是实例变量的用途。