“你的第二个iOS应用程序”:我如何实现Singleton?

时间:2013-03-27 08:42:32

标签: iphone ios objective-c singleton

我仍在尝试改进"My Second iOS App",这是Apple提供的教程。这是故事板的图片,附加了对应该发生的事情的评论。

detail of the storyboard with added commentary

单击完成按钮(步骤3)时,实际屏幕应返回主菜单(3.a),同时应将完成的BirdSightingObject添加到BirdMasterViewController(3.b)列表中。所以我认为我可以使用Singleton,因为可能只有一个对象同时添加,它使得从不同类中访问变得更加容易。

在本教程中,已经为数据处理提供了一个类,“BirdSighting”,它可能被用作单例。但由于我只有初级知识的OOP和设计模式,我不知道,如果我可以使用它,或者我必须自己编写参考现有类。

其次:我一点也不知道如何访问BirdMasterViewController方法中的(IBAction)done以最终将对象保存在列表中。

注意:以下源代码部分由Apple,Inc。提供。请参阅this以查看本教程的完整代码清单。不打算复制权限。

BirdSighting.h

@interface BirdSighting : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *location;
@property (nonatomic, strong) NSDate *date;

- (id)initWithName:(NSString *)name location:(NSString *)location date:(NSDate *)date;
- (id)initWithNameOnly:(NSString *)name date:(NSDate *)date;

@end

BirdSighting.m

#import "BirdSighting.h"

@implementation BirdSighting

- (id)initWithName:(NSString *)name location:(NSString *)location date:(NSDate *)date
{
    self = [super init];
    if (self)
    {
        _name = name;
        _location = location;
        _date = date;
        return self;
    }
    return nil;
}

-(id)initWithNameOnly:(NSString *)name date:(NSDate *)date
{
    self = [super init];
    if (self)
    {
        _name = name;
        _date = date;
        return self;
    }
    return nil;
}

@end

(IBAction)done方法,MainMenuViewController.m

- (IBAction)done:(UIStoryboardSegue *)segue
{
    if ([[segue identifier] isEqualToString:@"ReturnInput"])
    {
        AddLocationToSighting *addController = [segue sourceViewController];
        if (addController.birdSighting)
        {
            [self.dataController addBirdSightingWithSighting:addController.birdSighting];
            [[self tableView] reloadData];
        }
        [self dismissViewControllerAnimated:YES completion:NULL];
    }
}

要点:

  • 我可以将 BirdSighting 转换为单身吗?如果是,那么缺少什么? (不需要为我编写代码,我希望如果你提供一个提示,我可以自己做。)
  • 如何将对象保存在 BirdMasterViewController 中?我不知道如何访问(IBAction)done中未涉及的ViewController。

1 个答案:

答案 0 :(得分:4)

  

我可以将BirdSighting变成单身人士吗?

没有

BirdSighting模型对象,不是集合,当然也不是需要全局访问的变量。但是,您可以制作一个单独的Bird Sighting Manager,它可以控制鸟类目击列表,并可以根据需要添加,删除或序列化它们。虽然,请记住,单身人士创造全球状态,这总是一件坏事。

  

如何在BirdMasterViewController中保存对象?

这又回到了上面提到的单身人士身上。我还建议添加控制器和主列表视图之间的某种形式的委派,但我发现这可能是所有中间视图控制器的挑战。即使是通知也会有效(在info参数中有新的瞄准)。