我正在制作一个用于练习的应用程序。该应用程序通过AppDelegate与一个简单的模型共享。为了操作模型,我从模型中获得了NSDictionary对象,并将其分配给viewController属性。但是似乎太冗长了。
// viewController.h
@property (nonatomic, strong) NSMutableDictionary *bookDetail;
@property (nonatomic, strong) bookModel *modelBook;
// viewController.m
- (void)setLabel {
self.label_name.text = self.bookDetail[@"name"];
self.label_author.text = self.bookDetail[@"author"];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
id appDelegate = [[UIApplication sharedApplication] delegate];
self.modelBook = [appDelegate modelBook];
self.bookDetail = self.modelBook.bookList[self.modelBook.selectedId];
[self setLabel];
self.editMod = NO;
}
- (IBAction)editSave:(id)sender {
if (self.editMod == NO) {
....
[self.nameField setText:self.bookDetail[@"name"]];
[self.authorField setText:self.bookDetail[@"author"]];
....
} else {
self.bookDetail = [@{@"name" : self.nameField.text,
@"author" : self.authorField.text} mutableCopy];
[self setLabel];
....
}
}
@end
*bookDetail
的工作方式类似于self.modelBook.bookList[self.modelBook.selectedId]
的副本,而不是引用的副本。使用self.modelBook.bookList[self.modelBook.selectedId]
效果很好,但我不想这么做。如何简化此代码? 最佳答案
*bookDetail
的工作方式类似于self.modelBook.bookList[self.modelBook.selectedId]
的副本,而不是引用的副本。使用self.modelBook.bookList[self.modelBook.selectedId]
效果很好,但我不想这么做。
您的问题对我来说尚不清楚,因此这可能是错误的,但希望对您有所帮助。bookDetail
在通常意义上不是“副本”,而是对self.modelBook.bookList[self.modelBook.selectedId]
进行分配时bookDetail
所引用的同一词典的引用。
假设您说使用后者的“效果很好”听起来好像self.modelBook.selectedId
正在更改,并且您期望bookDetail
自动跟踪该更改,现在引用了另一本词典。那不是分配的工作原理。
如何简化此代码?
您可以在modelBook
类[1]中添加一个属性,例如currentBook
,该属性会返回bookList[selectedID]
,因此每次调用它都会得到当前的书。在上面的代码中,然后使用self.modelBook.currentBook
而不是self.bookDetail
,并可以将属性bookDetail
删除为未使用(且不正确)。
高温超导
[1]注意:应遵循命名约定将其称为ModelBook
。您是否注意到语法着色不正确?那是因为您没有遵守约定。