我正在为练习制作应用。这个应用程序通过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]
效果很好,但我不想这样做。我该如何简化此代码?
答案 0 :(得分:1)
创建BookModel的共享实例,然后您可以在任何地方访问它:
在bookModel中写这个:
+ (instancetype)sharedInstance
{
static bookModel *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[bookModel alloc] init];
// Do any other initialisation stuff here
});
return sharedInstance;
}
然后你可以像bookModel.sharedInstance.bookList
那样访问它
答案 1 :(得分:1)
*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
删除为未使用(并且不正确)。
HTH
[1]注意:这应该被称为ModelBook
以遵循命名约定。您是否注意到语法着色不正确?那是因为你没有遵循惯例。