Avatar
3012
Člen
Avatar
3012:27. května 18:41

Dobrý deň, pracujem na applikacii pre iphone napýsanej v objectiveC a potreboval by som uložiť a načítať pole objektov: NsmutableArray z NSuserDefaults a nahrať ho do druheho poľa ktore budem mocť spracovať (upraviť, rozšíriť) a nasledne znovu uložiť do nsuser defaults. V knihe ktoru mám popysuju iba uloženie a nacitanie čísla, a pole obiektov z neho odvodiť nešlo, preto som na internete našiel nasledujuci kod, ktory som podľa svojich potrieb upravil:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:spomienky];
    NSUserDefaults *ulozene = [NSUserDefaults standardUserDefaults];
    [ulozene setObject:data forKey:@"ulozene"];


        NSMutableArray *nacitane = [NSKeyedUnarchiver unarchiveObjectWithData:[ulozene objectForKey:@"ulozene"]];

skončí touto chybou: Thread 1: signal SIGABRT zobrazenou v červenom ramiku pri tomto kode:

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

v logu je pysane:

2018-05-27 18:16:59.878664+0200 remember[1824:107­797] enter the text
2018-05-27 18:16:59.879052+0200 remember[1824:107­797] -[spomienka encodeWithCoder:]: unrecognized selector sent to instance 0x60400003ada0
2018-05-27 18:16:59.884709+0200 remember[1824:107­797] *** Terminating app due to uncaught exception 'NSInvalidArgu­mentException', reason: '-[spomienka encodeWithCoder:]: unrecognized selector sent to instance 0x60400003ada0'
*** First throw call stack:
(
0 CoreFoundation 0x000000010dded1e6 __exceptionPre­process + 294
1 libobjc.A.dylib 0x000000010d482031 objc_exception_throw + 48
2 CoreFoundation 0x000000010de6e784 -[NSObject(NSObject) doesNotRecogni­zeSelector:] + 132
3 CoreFoundation 0x000000010dd6f898 ___forwarding___ + 1432
4 CoreFoundation 0x000000010dd6f278 _CF_forwardin­g_prep0 + 120
5 Foundation 0x000000010cecb5f0 _encodeObject + 1197
6 Foundation 0x000000010ceccaf0 -[NSKeyedArchiver _encodeArrayO­fObjects:forKe­y:] + 439
7 Foundation 0x000000010cecb5f0 _encodeObject + 1197
8 Foundation 0x000000010cefde3a +[NSKeyedArchiver archivedDataWit­hRootObject:] + 156
9 remember 0x000000010cb7ec3a -[ViewController ulozNovuTlacitlo:] + 810
10 UIKit 0x000000010e26b448 -[UIApplication sendAction:to:from:f­orEvent:] + 83
11 UIKit 0x000000010e3e6804 -[UIControl sendAction:to:fo­rEvent:] + 67
12 UIKit 0x000000010e3e6b21 -[UIControl _sendActionsFo­rEvents:withE­vent:] + 450
13 UIKit 0x000000010e3e5a69 -[UIControl touchesEnded:wit­hEvent:] + 580
14 UIKit 0x000000010e2e011f -[UIWindow _sendTouchesFo­rEvent:] + 2729
15 UIKit 0x000000010e2e1821 -[UIWindow sendEvent:] + 4086
16 UIKit 0x000000010e285370 -[UIApplication sendEvent:] + 352
17 UIKit 0x000000010ebc657f __dispatchPre­processedEven­tFromEventQue­ue + 2796
18 UIKit 0x000000010ebc9194 __handleEventQu­eueInternal + 5949
19 CoreFoundation 0x000000010dd8fbb1 __CFRUNLOOP_IS_CAL­LING_OUT_TO_A_SO­URCE0_PERFORM_FUN­CTION__ + 17
20 CoreFoundation 0x000000010dd744af __CFRunLoopDo­Sources0 + 271
21 CoreFoundation 0x000000010dd73a6f __CFRunLoopRun + 1263
22 CoreFoundation 0x000000010dd7330b CFRunLoopRunSpe­cific + 635
23 GraphicsServices 0x0000000112f57a73 GSEventRunModal + 62
24 UIKit 0x000000010e26a0b7 UIApplicationMain + 159
25 remember 0x000000010cb7f37f main + 111
26 libdyld.dylib 0x0000000111846955 start + 1
27 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)

Tuto cybu nedokážem niako opraviť, hoci kód je podľa xcode napysaný správne.

Ak by ste my vedeli pomôcť kód opraviť, prípadne poskytnúť my niaky iný spôsob ako pole obiektov uložiť do NSuser defaults a nasledne nahrať toto uložené pole do ineho poľa v ktorom bude možne s obiektmy pracovať a znova ich ukladať do Nsuser budem rád.

Za pomoc a ochotu dopredu ďakujem.

 
Odpovědět 27. května 18:41
Avatar
3012
Člen
Avatar
3012:27. května 18:49

ešte by som dodal, že som našiel aj tento kód a tiež skonšil rovnakou cybou hoci nemal v zápyse chybu:

NSUserDefaults *ulozeneSpomienky = [NSUserDefaults standardUserDefaults];

    [[NSUserDefaults standardUserDefaults] setObject:spomienky forKey:@"spomienky"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    //nacitanie spomienok
    NSMutableArray *nacitaneSpomienky = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"spomienky"] mutableCopy];
 
Nahoru Odpovědět 27. května 18:49
Avatar
Phyber
Člen
Avatar
Phyber:27. května 19:45

Můžeš přidat zdroják classy, kterou se snažíš uložit (co za třídu je spomienka)?
Problém bude pravděpodobně v tom, že tvá třída nemá protokol NSCoding.

 
Nahoru Odpovědět 27. května 19:45
Avatar
3012
Člen
Avatar
3012:27. května 20:12

Snažím sa uložiť triedu Spomienka a tá vyzerá takto:

spomienka.h:

#import <Foundation/Foundation.h>

@interface spomienka : NSObject
{
    NSString *spomienkaDatum;
    NSString *spomienkaPoznamka;
}

-(void)nacitaj: (NSString *)datum
       aPoznamka: (NSString *)poznamka;

-(void)zobrazSpomienku;

-(NSString *)vratDatum;
-(NSString *)vratPoznamka;

@end

spomienka.m:

#import "spomienka.h"

@implementation spomienka

-(void)nacitaj: (NSString *)datum
     aPoznamka: (NSString *)poznamka
{
    spomienkaDatum = datum;
    spomienkaPoznamka = poznamka;
}

-(void)zobrazSpomienku
{
    NSLog(@"%@ %@", spomienkaDatum, spomienkaPoznamka);
}

-(NSString *)vratDatum
{
    return [NSString stringWithFormat:@"%@", spomienkaDatum];
}

-(NSString *)vratPoznamka
{
    return [NSString stringWithFormat:@"%@", spomienkaPoznamka];
}

@end

jednoducho spomienky maju byť uložené v poli, a to sa ma dať uložiť a načítať z NSuser aby som ho mohol upravovať, praca s poľom funguje (viem doň pridavať, odoberať a čítať zneho či upravovať objekty v ňom), iba ho nedokážem uložiť tak aby som s nim mohol pracovať aj pri znovuspustení applikácie. Ďakujem za ochotu.

 
Nahoru Odpovědět 27. května 20:12
Avatar
Phyber
Člen
Avatar
Phyber:27. května 21:00

Je třeba, aby třída spomienka implementovala protokol NSCoding. Třídu je tedy potřeba upravit následujícím způsobem:

spomienka.h :

@interface spomienka : NSObject<NSCoding> {
    ...
}

spomienka.m :

#define datumKey @"datum"
#define poznamkaKey @"poznamka"

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject: spomienkaDatum forKey: datumKey];
    [encoder encodeObject: spomienkaPoznamka forKey: poznamkaKey];
}

- (id)initWithCoder:(NSCoder *)decoder {
    if (self = [super init]) {
    self.spomienkaDatum = [decoder decodeObjectForKey: datumKey];
    self.spomienkaPoznamka = [decoder decodeObjectForKey: poznamkaKey];
  }
  return self;
}

Mimochodem doporučuji pojmenovávat třídy s prvním velkým písmenem. Pokud by jsi chtěl vyzkoušet něco jiného na ukládání dat, tak můžeš googlit CoreData.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 27. května 21:00
Avatar
3012
Člen
Avatar
3012:27. května 22:03

Veľmy ďakujem za odpoveď, už to funguje, čo sa týka CoreData určite sa na ne neskôr pozriem, práca z dátamy je pre mňa dosť podstatná. len pre zaujímavosť, kompilator my opravil nasledujuci kód:

self.spomienkaDatum = [decoder decodeObjectForKey: datumKey];
    self.spomienkaPoznamka = [decoder decodeObjectForKey: poznamkaKey];

takto:

self->spomienkaDatum = [decoder decodeObjectForKey: datumKey];
        self->spomienkaPoznamka = [decoder decodeObjectForKey: poznamkaKey];

Ešte raz ďakujem, veľmy si vážim tuto pomoc.

 
Nahoru Odpovědět 27. května 22:03
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.