静态NSArray字符串 - 在View Controller中初始化的方式/位置

Ale*_*ber 46 initialization objective-c nsmutablearray nsarray ios

在Master-Detail应用程序中,我想显示一个标题为5个部分的TableView:

  1. 你的举动
  2. 他们的举动
  3. 赢得了比赛
  4. 失落的游戏
  5. 选项

所以我在Xcode 5.0.2中创建了一个空白的Master-Detail应用程序,然后在它的MasterViewController.m(这是一个UITableViewController)中我正在尝试实现该方法:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return _titles[section];
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何初始化NSArray _titles?

我正在尝试使用MasterViewController.m:

#import "MasterViewController.h"
#import "DetailViewController.h"

static NSArray *_titles_1 = @[
    @"Your Move",
    @"Their Move",
    @"Won Games",
    @"Lost Games",
    @"Options"
];

@interface MasterViewController () {
    NSMutableArray *_games;

    NSArray *_titles_2 = @[
                         @"Your Move",
                         @"Their Move",
                         @"Won Games",
                         @"Lost Games",
                         @"Options"
    ];
}
@end

@implementation MasterViewController

- (void)awakeFromNib
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        self.clearsSelectionOnViewWillAppear = NO;
        self.preferredContentSize = CGSizeMake(320.0, 600.0);
    }
    [super awakeFromNib];
}

- (void)viewDidLoad
{
     ....
}
Run Code Online (Sandbox Code Playgroud)

但上面的两个尝试都给我语法错误:

在此输入图像描述

更新:

令我惊讶的是,对于这个简单的问题有很多建议,但作为iOS/Objective-C新手,我不确定,哪种解决方案最合适.

dispatch_once - 在多线程应用程序中执行某些操作不是运行时操作吗?这不是太过分了吗?我期待一个用于启动const数组的编译时解决方案......

viewDidLoad - 当我的应用程序在后台和前台之间切换时,是不是不必要一次又一次地启动我的const数组?

我不应该更好地设置NSArrayin awakeFromNib(因为我使用所有ViewControllers的stroyboard场景)?或者也许initSomething(正确的方法initWithStyle?)

jle*_*ehr 79

编写一个返回数组的类方法.

+ (NSArray *)titles
{
    static NSArray *_titles;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _titles = @[@"Your Move",
                    @"Their Move",
                    @"Won Games",
                    @"Lost Games",
                    @"Options"];
    });
    return _titles;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在任何需要的地方访问它,如下所示:

NSArray *titles = [[self class] titles];
Run Code Online (Sandbox Code Playgroud)

  • 在编译时无法分配对象,因此这通常是我们所做的.请注意,`dispatch_once`是一个Grand Central Dispatch函数,可确保提供的块中的代码仅在应用程序的生命周期中运行一次. (3认同)
  • 您可以使用完全限定的类名来调用静态方法.而不是[[自我类]标题],你可以只调用[MyClassName标题]; (3认同)
  • 用户要求WHERE创建它,而不是如何创建.您没有提供任何帮助,用户答案显示他试图在界面中实例化对象 (2认同)

Emm*_*uel 12

你可以在class method + initialize中初始化它

static NSArray *_titles_1;

@implementation MasterViewController
+ (void)initialize {
    _titles_1 = @[
        @"Your Move",
        @"Their Move",
        @"Won Games",
        @"Lost Games",
        @"Options"
    ];
}
@end
Run Code Online (Sandbox Code Playgroud)


Ano*_*dya 7

你应该在上面声明你的静态数组 @implementation.

static NSArray *titles_1 = nil;

@implementation ...
Run Code Online (Sandbox Code Playgroud)

而在其定义initawakeFromNib或任何其他方法一样viewDidLoad,applicationDidFinishLaunching无论你想.

- (void)initMethod{ //change the method name accordingly

    if (titles_1 == nil){
        [self setTitles_1:@[ @"Your Move", @"Their Move", @"Won Games", @"Lost Games", @"Options" ]];
    }
}
Run Code Online (Sandbox Code Playgroud)


Pab*_* A. 7

你也可以这样做:

static NSString * const strings[] = {
        [0] = @"string_1",
        [1] = @"string_2",
        [2] = @"string_3",
        [3] = @"string_4",
        // ...
    };
Run Code Online (Sandbox Code Playgroud)

这不是一个,NSArray但你可以NSStrings像这样访问strings[n]


Ale*_*ber 6

我想知道,如果以下是一个好方法(回答我自己的问题):

#import "MasterViewController.h"
#import "DetailViewController.h"

static const NSArray *_titles;

@interface MasterViewController () {
    NSMutableArray *_objects;
    NSMutableArray *_yourMove;
    NSMutableArray *_theirMove;
    NSMutableArray *_wonGames;
    NSMutableArray *_lostGames;
    NSMutableArray *_options;
}
@end

@implementation MasterViewController

+ (void)initialize
{
    // do not run for derived classes
    if (self != [MasterViewController class])
        return;

    _titles = @[
        @"Your Move",
        @"Their Move",
        @"Won Games",
        @"Lost Games",
        @"Options"
    ];
}
Run Code Online (Sandbox Code Playgroud)

这种方式const NSArray在我需要它之前就已经初始化了(在MasterViewController课堂上).而self检查防止再次运行此方法-当一些继承类没有实现自己的+initialize方法.