我正在制作一个用于练习的应用程序。该应用程序通过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。您是否注意到语法着色不正确?那是因为您没有遵守约定。

07-28 10:47