2016-09-27 4 views
2

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

Здесь, когда один «выгружаемый» счет возвращает 8 (но он должен возвращать 1), и если число более одного «выгрузки» возвращает количество «выгрузок», как это должно быть в первом случае.

NSDictionary *jsonDictionary = aDicLog; 
NSMutableArray *tableData = jsonDictionary[@"multimedia"][@"uploads"][@"upload"]; 

int count = [tableData count]; 
NSLog(@"COUNT: %i", count); 

Таблица

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [tableData count]; 
} 

Cell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    //App Crashes in this line 
    NSDictionary *ldUpload = [tableData objectAtIndex:indexPath.row]; 
    ... 
    return cell; 
} 

Исключение, имея одну "загрузить":

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryM objectAtIndex:]: unrecognized selector sent to instance 

Словарь выглядит следующим образом:

Вот когда приложение падает: (С только один «загрузить»)

Printing description of tableData: 
{ 
    FileName =  { 
     text = "IMG_0510.MOV"; 
    }; 
    status =  { 
     text = 2; 
    }; 
    Event =  { 
     text = Q; 
    }; 
    Date =  { 
     text = "9/9/2016 11:01:58 AM"; 
    }; 
    Publicacion =  { 
     text = "Example"; 
    }; 
    Seccion =  { 
     text = Sistemas; 
    }; 
    idMultimedia =  { 
     text = 1136; 
    }; 
    text = ""; 
} 

Вот когда приложение работает хорошо: (С более чем один " загрузить ")

Printing description of tableData: 
<__NSArrayM 0x7a49dc90>(
{ 
    FileName =  { 
     text = "1-FB5A9792.MOV"; 
    }; 
    status =  { 
     text = 4; 
    }; 
    Event =  { 
     text = Test; 
    }; 
    Date =  { 
     text = "9/7/2016 9:06:21 AM"; 
    }; 
    Publicacion =  { 
     text = "Example"; 
    }; 
    Seccion =  { 
     text = Sistemas; 
    }; 
    idMultimedia =  { 
     text = 993; 
    }; 
    text = ""; 
}, 
{ 
    FileName =  { 
     text = "2-FB5A9793.MOV"; 
    }; 
    status =  { 
     text = 4; 
    }; 
    Event =  { 
     text = Test; 
    }; 
    Date =  { 
     text = "9/7/2016 9:06:21 AM"; 
    }; 
    Publicacion =  { 
     text = "Example"; 
    }; 
    Seccion =  { 
     text = Sistemas; 
    }; 
    idMultimedia =  { 
     text = 994; 
    }; 
    text = ""; 
},... 

I'm с помощью XMLReader для преобразования XML в Dictionary, а затем передать вышеуказанные данные в tableData

XML

<multimedia> 
    <uploads> 
    <upload> 
     <id>1136</id> 
     <Date>9/9/2016 11:01:58 AM</Date> 
     <FileName>IMG_0510.MOV</FileName> 
     <status>2</status> 
     <Publicacion>Example</Publicacion> 
     <Seccion>Sistemas</Seccion> 
     <Event>Q</Event> 
    </upload> 
    </uploads> 
</multimedia> 

Как я могу вернуть 1 вместо 8, если только 1 «загрузить» и п в случае п «загрузки» 's?

+0

Когда он выходит из строя, это потому, что 'tableData' является' NSDictionary', а не 'NSArray', в том случае, когда есть только один элементов, в то время, когда существуют различные элементы, это массив словарей. – Larme

ответ

2

Вы можете проверить тип объекта, и если это Dictionary или NSArray на основании того, что Генерируй tableData array.

id uploadsObj = jsonDictionary[@"multimedia"][@"uploads"][@"upload"]; 
if ([uploadsObj isKindOfClass:[NSDictionary class]]) { 
    NSMutableArray *tableData = [NSMutableArray arrayWithObject:(NSDictionary*)uploadsObj]; 
} 
else if ([uploadsObj isKindOfClass:[NSArray class]]) { 
    NSMutableArray *tableData = [NSMutableArray arrayWithArray:(NSArray*)uploadsObj]; 
} 
+0

Спасибо Nirav D, но в строке 'NSMutableArray * tableData = [arrayWithArray: (NSArray *) uploadsObj];' он показывает ошибку 'Использование необъявленного идентификатора 'arrayWithArray'', я что-то пропустил? – CGR

+1

Это была ошибка только опечатки, проверьте отредактированный ответ. –

+0

Работает как очарование! – CGR

1

Swift Версия:

Просто проверьте, если данные представляют собой словарь или массив:

var tableData:[[String:AnyObject]]! = [] 

if let data = jsonDictionary[@"multimedia"][@"uploads"][@"upload"] as? [String:AnyObject] { 
    print("Single upload data") 
    tableData.append(data) 
} else { 
    if let data = jsonDictionary[@"multimedia"][@"uploads"][@"upload"] as? [[String:AnyObject]] { 
     print("multiple upload data") 
     tableData = data 
    } 
} 
+1

Batter вы меняете свой ответ с Objective C, иначе кто-то проголосует за вас, потому что OP работает над Objective C. –

+0

oops..Я буду упоминать его как быструю версию. Потому что вы уже разместили правильное решение. –