我的视图控制器正在保存我的对象属性和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或多或少是相同的“..为什么我不能仅仅将模型用作自我的替代?”毕竟,我将功能外包
答案 0 :(得分:1)
我可能会尝试在某种程度上缩小问题的重点;但我会对我认为的问题采取行动:
我的视图控制器正在保存我的对象属性和iVars等。 他们不应该持有任何东西。
如果您遵循良好的MVC原则,那么您的视图控制器不应具有更准确属于模型层的属性。但鉴于视图控制器是模型和视图之间的管道,控制器上的某些暴露属性是必不可少的。
假设您有一个视图控制器,它显示有关员工的详细信息 - 名字,姓氏,工资,部门等。您可能需要一个代表该员工的模型对象。我们称之为MYEmployee
。接下来考虑其他类需要了解的MYEmployee
实例。这些是类接口中公开的属性。
现在,我们的控制器如何使用MYEmployee
的实例?在这里,视图控制器 - 让我们称之为MYEmployeeDetailViewController
- 需要知道要显示的员工,因此我们需要在视图控制器的界面中公开所代表的员工,例如
@property (nonatomic, strong) MYEmployee *employee;
现在MYEmployeeDetailViewController
班级用户可以传递员工进行展示。
然后如何使用我想象的类对象?
我认为你的不确定性围绕着诸如“谁拥有什么数据?”等问题。等我的建议是退后一步,真正阅读Apple关于MVC的文档,并利用一些资源面向对象设计。它总是帮助我首先考虑接口(类接口,而不是UI)而不是实现。在编码之前映射出类之间的关系也有帮助。
答案 1 :(得分:0)
您应该在新的init
对象myClass
上致电item
,而不是仅为alloc
致电初学者。我怀疑你真的只需要分配内存但实际上没有初始化对象。
除此之外,你的问题有点难以理解。您使用对象来封装数据,然后将该数据公开给可能需要它的其他对象。视图控制器将具有处理视图的对象和处理数据的对象。控制器将从数据对象中获取所需内容,并根据需要将其传递给查看对象。通过这种方式,控制器将自己保存数据模型(如果您正在进行适当的MVC设计)。
你说你希望你的类对象在方法之间保存数据:那就是实例变量的用途。