2013-03-09 3 views
0

Привет, я пытаюсь сохранить данные в файле с помощью класса, сохраненного на диске. Он сохраняет данные, но не возвращает правильные данные. Plz помочь мнеАрхивирование и извлечение массива из класса в Objective-c

Вот мой ViewController.h

@interface MIGViewController : UIViewController 
- (IBAction)hideKeyboard:(id)sender; 
@property (strong, nonatomic) NSMutableArray * myArray; 
@property (strong, nonatomic) NSString * pathToFile; 
@property (weak, nonatomic) IBOutlet UITextField *nameField; 
@property (weak, nonatomic) IBOutlet UITextField *idField; 
@property (weak, nonatomic) IBOutlet UITextField *addressField; 
@property (weak, nonatomic) IBOutlet UITextField *phoneField; 
- (IBAction)addButtonTapped:(id)sender; 
- (IBAction)saveButtonTapped:(id)sender; 

@end 

Вот вид Controller.m

#import "MIGViewController.h" 
#import "MIGStudent.h" 

@interface MIGViewController() 

@end 

@implementation MIGViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString * documentsPath = [paths objectAtIndex:0]; 
    self.pathToFile = [documentsPath stringByAppendingPathComponent:@"students.sukh"]; 

    NSFileManager * manager = [NSFileManager defaultManager]; 
    if ([manager fileExistsAtPath:self.pathToFile]) 
    { 
     //File exists 
     self.myArray = [NSKeyedUnarchiver unarchiveObjectWithFile:self.pathToFile]; 

     UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"Students array" message:[self.myArray description]delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil]; 
     [alert show]; 
    } 
    else 
    { 
     //File doesn't exist 
     self.myArray = [NSMutableArray array]; 
    } 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)addButtonTapped:(id)sender { 
    NSString * name =self.nameField.text; 
    NSString * address = self.addressField.text; 
    int studentID = [self.idField.text intValue]; 
    int phoneNumber = [self.phoneField.text intValue]; 
    MIGStudent * student = [[MIGStudent alloc] initWithName:name address:address studentID:studentID phoneNumber:phoneNumber]; 
    [self.myArray addObject:student]; 
    self.nameField.text = @""; 
    self.addressField.text = @""; 
    self.idField.text = @""; 
    self.phoneField.text = @""; 
} 

- (IBAction)saveButtonTapped:(id)sender { 
    [NSKeyedArchiver archiveRootObject:self.myArray toFile:self.pathToFile]; 
} 
- (IBAction)hideKeyboard:(id)sender { 
    [self resignFirstResponder]; 
} 
@end 

Вот мой класс Student.h

@interface MIGStudent : NSObject <NSCoding> 

@property (strong, nonatomic) NSString * name; 
@property (strong, nonatomic) NSString * address; 
@property (nonatomic) int studentID; 
@property (nonatomic) int phoneNumber; 

-(id)initWithName:(NSString *) name address:(NSString *)address studentID: (int)studentID phoneNumber:(int) phoneNumber; 

@end 

И вот Student.m

#import "MIGStudent.h" 

@implementation MIGStudent 

-(id) initWithName:(NSString *)name address:(NSString *)address studentID:(int)studentID phoneNumber:(int)phoneNumber 
{ 
    if (self=[super init]) 
    { 
     self.name = name; 
     self.address = address; 
     self.phoneNumber = phoneNumber; 
     self.studentID = studentID; 
    } 
    return self; 
} 

-(void) encodeWithCoder:(NSCoder *)aCoder 
{ 
    //Used when saving to disk 
    [aCoder encodeObject:self.name forKey:@"name"]; 
    [aCoder encodeObject:self.address forKey:@"address"]; 
    [aCoder encodeInt:self.phoneNumber forKey:@"phoneNumber"]; 
    [aCoder encodeInt:self.studentID forKey:@"studentID"]; 
} 

-(id) initWithCoder:(NSCoder *)aDecoder 
{ 
    //Used when reading from disk 
    self.name = [aDecoder decodeObjectForKey:@"name"]; 
    self.address = [aDecoder decodeObjectForKey:@"address"]; 
    self.phoneNumber = [aDecoder decodeIntForKey:@"phoneNumber"]; 
    self.studentID = [aDecoder decodeIntForKey:@"studentID"]; 

    return self; 
} 
@end 

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

enter image description here

Заранее спасибо

ответ

1

Это не проблема ваша реализация NSCoding, на самом деле это даже не проблема! Так NSArray печатает себя буквально (результат метода -description). Тот факт, что он это делает, указывает на то, что процесс архивирования/де архивации прошел гладко. Массив - это набор круглых скобок(), а объекты внутри находятся в формате <Class : memory address>. Если у вас есть массив недопустимых объектов, то ваш массив скорее всего откажется печатать или сработает, когда объекты ученика будут добавлены к нему.

Вы можете воспользоваться этим в своем классе MIGStudent и переопределить -description, чтобы распечатать более удобный формат. Например:

-(NSString*)description { 
    return [NSString stringWithFormat:@"<%@ : %p Student named: %@ - who lives at: %@ With the ID number: %d and the phone number: %d>", NSStringFromClass(self.class), self, self.name, self.address, self.studentID, self.phoneNumber]; 
} 

Как Замечание, Инициализаторы всегда вызов через супер. Ваш метод initWithCoder: всегда будет возвращать нуль.

+0

Работы грозно – Happy

+0

Большое спасибо сэр :) – Happy

0

Ваш метод initWithCoder: неверен он потерпит неудачу, как в настоящее время он будет возвращать ноль или какое-то значение мусора, оно должно быть:

-(id) initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super init]; 
    if (self) 
    { 
     //Used when reading from disk 
     self.name = [aDecoder decodeObjectForKey:@"name"]; 
     self.address = [aDecoder decodeObjectForKey:@"address"]; 
     self.phoneNumber = [aDecoder decodeIntForKey:@"phoneNumber"]; 
     self.studentID = [aDecoder decodeIntForKey:@"studentID"]; 
    } 

    return self; 
} 

Во-вторых вы можете переопределить description или debugDescription метод вашего класса, чтобы вернуть заказ информацию об этом классе.

+0

Привет SAPLogix Если я заменить мою initCoder с вашими он показывает мне эту ошибку Нет видимых @interface для «NSObject» заявляет селектор «initWithCoder:» – Happy

+0

@Sukhi должно быть 'init' моя ошибка исправила вышеуказанный код. – SAPLogix

+0

отлично работает Большое спасибо Можете ли вы, пожалуйста, помочь мне в более полезной вещи Как я могу сравнить имя с другой новой строкой, введенной пользователем. Пожалуйста, помогите мне в этом Спасибо – Happy

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

  • Нет связанных вопросов^_^