当按下指向表格视图的按钮时,应用程序崩溃

时间:2013-12-02 14:37:42

标签: ios objective-c uitableview uibutton nsuserdefaults

我有一个指向视图的按钮,每当我看到按下按钮时我的应用程序崩溃了。谁能告诉我为什么?代码是按钮推送到的视图的实现文件。

@implementation OpenShiftViewController

-(void)viewDidLoad
{
    [super viewDidLoad];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    myDictionary = [defaults dictionaryRepresentation];
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{
    return 1; 
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return myDictionary.count; 
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *CellIdentifier = @"cell";
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    NSArray * allKeys = [myDictionary allKeys];
    cell.textLabel.text = [myDictionary objectForKey:[allKeys objectAtIndex:indexPath.row]];
    cell.detailTextLabel.text = [myDictionary objectForKey:[allKeys     objectAtIndex:indexPath.row]];
    return cell; 
}

@end

5 个答案:

答案 0 :(得分:1)

- (void)viewDidLoad

{

[super viewDidLoad];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
myDictionary = [defaults dictionaryRepresentation];


myMutableArray = [[NSMutableArray alloc]init];
[self storingObjectsFromDictionaryToArray];
// Do any additional setup after loading the view, typically from a nib.

}

-(void)storingObjectsFromDictionaryToArray

{

NSArray *arr = [myDictionary allKeys];


  [myMutableArray addObjectsFromArray:[myDictionary valueForKey:[arr objectAtIndex:0]]];
NSString *str = [NSString stringWithFormat:@"%@",[myDictionary valueForKey:[arr objectAtIndex:1]]];
[myMutableArray addObject:str];
str = [NSString stringWithFormat:@"%@",[myDictionary valueForKey:[arr objectAtIndex:2]]];
[myMutableArray addObject:str];
 [myMutableArray addObjectsFromArray:[myDictionary valueForKey:[arr objectAtIndex:3]]];
 [myMutableArray addObject:[myDictionary valueForKey:[arr objectAtIndex:4]]];
 [myMutableArray addObjectsFromArray:[myDictionary valueForKey:[arr objectAtIndex:5]]];
 [myMutableArray addObjectsFromArray:[myDictionary valueForKey:[arr objectAtIndex:6]]];
 [myMutableArray addObject:[myDictionary valueForKey:[arr objectAtIndex:7]]];

}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

return 1;

}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return myMutableArray.count;

}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *CellIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

}



 cell.textLabel.text = [myMutableArray objectAtIndex:indexPath.row];
cell.detailTextLabel.text = [myMutableArray objectAtIndex:indexPath.row];


return cell;

}

答案 1 :(得分:0)

  

错误是线程1:断点9.1

啊......你可能有一个断点被激活了吗?

答案 2 :(得分:0)

您没有收到错误 - 这只是因为您有一个激活的断点。

如果你正在使用Xcode 4,那么你可以看到'Breakpoints',如下所示。只需单击它即可禁用断点。

enter image description here

如果您使用的是Xcode 5,则必须单击此蓝色按钮以禁用断点。

enter image description here

答案 3 :(得分:0)

正如AlexVogel在评论中指出的那样,使用init方法来初始化字典。 或者,您可以使用属性延迟加载:

- (NSDictionary *)myLoadedDictionary{
    if (!myDictionary) {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        myDictionary = [defaults dictionaryRepresentation];
    }
    return myDictionary;
}

现在,在你的班级中,使用[self myLoadedDictionary]而不是myDictionary。

我不在我的机器上,但我非常确定您甚至可以将myDictionary定义为getter,这样您就可以在代码中使用相同的名称而不是myLoadedDictionary。

答案 4 :(得分:0)

像其他人一样,我想指出应该发布你的错误。

现在我也看到了cellAtindexPath逻辑的一个问题。您尝试在空单元格上设置数据,请参阅[tableView dequeueReusableCellWithIdentifier:CellIdentifier];如果你已经给它一些东西,它只会给你一些东西。

你有两个加载单元格的方法,新的方式或旧的方式,两者都有点相同。

选项一,我推荐这个:

在viewDidLoad中(或者不是)注册一个单元格标识符的类:

[self.tableview registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];

在CellForIndexPath中获取单元格:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

forIndexPath在这里很重要,使用旧的api将返回一个nil单元格。

选项2:

加载一个单元格,如果没有,则创建一个单元格。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (!cell) {
  cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];

}