2013-12-02 3 views
0

У меня есть кнопка, указывающая на представление, и всякий раз, когда я вижу, нажимает кнопку, с которой падает приложение. Может ли кто-нибудь сказать мне, почему? Код - это файл реализации для представления, на которое нажата кнопка.Приложение вылетает при нажатии кнопки, которая указывает на вид таблицы

@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 
+3

И что такое сообщение об ошибке? – juniperi

+0

Что такое IBAction для кнопки? Что значит «указывать на представление»? – CaptJak

+1

попытайтесь загрузить 'myDictionary' внутри метода init, потому что я думаю, что методы UITableViewDelegate/Datasource запрашивают 'myDictionary', прежде чем он будет правильно инициализирован. – AlexVogel

ответ

0

Ошибка резьбы 1: 9.1 останова

AHM ... Вы могли бы активировали точки останова?

+0

Как отключить его? – user2980581

0

У вас нет ошибки - это просто причина того, что у вас активированная точка останова.

Если вы используете Xcode 4, вы можете увидеть «Точки останова», как показано ниже. Просто нажмите на это, чтобы отключить точки останова.

enter image description here

Если вы используете Xcode 5, то вы должны нажать эту голубую кнопку, чтобы отключить контрольную точку.

enter image description here

+0

Я использую xcode 5 и дезактивировал точки останова, но он по-прежнему падает – user2980581

+0

Ошибка теперь говорит, что поток 1: сигнал SIGABRT. – user2980581

+0

приятель .. это исключение .. do u know what '[defaults dictionaryRepresentation]' возвращается? Он возвращает словарь массива. msgstr "" ". В этой строке u должен предоставить данные типа string в cell.textLabel.text, но u r дает массив .. поэтому вы получите исключение. Ниже в ответе я разместил правильный код, просто взгляните на dat –

0

Как AlexVogel отметил в комментарии, используйте метод инициализации для инициализации словаря. Кроме того, вы можете использовать отложенную загрузку с помощью свойства:

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

Теперь в вашем классе, потребляют [сам myLoadedDictionary] вместо MyDictionary.

Я не нахожусь на своей машине, но я уверен, что вы можете определить даже myDictionary как getter, чтобы вы могли использовать это имя в своем коде, а не myLoadedDictionary.

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; 

}

+0

Я сделал это, и он работает хорошо, поэтому спасибо. Однако в виде таблицы он загружает много писем для стран (например, Великобритании) и других мусора. Я хочу, чтобы там было столько строк, сколько было сохраненных сдвигов. Благодарю. – user2980581

0

Как и все остальные, я хотел бы указать на то, что должно опубликовать сообщение об ошибке.

Теперь я также вижу одну проблему с логикой cellAtindexPath. Ваша попытка установить данные в нулевой ячейке, см. [TableView dequeueReusableCellWithIdentifier: CellIdentifier]; только вернет вам что-то, если вы уже что-то дали.

У вас есть два варианта загрузки ячейки, новый способ или старый способ, оба являются похожими.

Вариант один и я рекомендую это:

в вашем viewDidLoad (или то, что нет) зарегистрировать класс для ячейки идентификторов:

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

В CellForIndexPath, чтобы получить сотовый идти:

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

Здесь важна функция forIndexPath, используя старый api, который вернет ноль.

Вариант 2:

нагрузка клетка, и если его ноль, создайте его.

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

} 
Смежные вопросы