如何创建引用变量?

时间:2017-12-27 08:03:31

标签: ios objective-c

我正在为练习制作应用。这个应用程序通过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]效果很好,但我不想这样做。我该如何简化此代码?

2 个答案:

答案 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以遵循命名约定。您是否注意到语法着色不正确?那是因为你没有遵循惯例。