Ale*_*ber 46 initialization objective-c nsmutablearray nsarray ios
在Master-Detail应用程序中,我想显示一个标题为5个部分的TableView:
所以我在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数组?
我不应该更好地设置NSArray
in 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)
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)
你应该在上面声明你的静态数组 @implementation
.
static NSArray *titles_1 = nil;
@implementation ...
Run Code Online (Sandbox Code Playgroud)
而在其定义init
或awakeFromNib
或任何其他方法一样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)
你也可以这样做:
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]
我想知道,如果以下是一个好方法(回答我自己的问题):
#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
方法.
归档时间: |
|
查看次数: |
43939 次 |
最近记录: |