Şimdi herkese merhaba öncelike. Basit bir to-do uygulaması yapmaya çalışıyorum. Umarım bilen biri çıkar.. Hadi başlayalım..

Şimdi öncelikle Object kodlarım şunlar..

Task.h

#import <Foundation/Foundation.h>

@interface Task : NSObject

@property (nonatomic,strong) NSString *name;
@property (nonatomic,assign) BOOL done;

-(id)initWithName:(NSString *)name done:(BOOL)done;

@end

Task.m

#import "Task.h"

@implementation Task

@synthesize name = _name;
@synthesize done = _done;

-(id)initWithName:(NSString *)name done:(BOOL)done {
    self = [super init];

    if (self) {
        self.name = name;
        self.done = done;
    }
    return self;
}

Daha sonra (void)applicationDidEnterBackground kullanarak data pliste kaydediyorum..

- (void)applicationDidEnterBackground:(NSNotification *)notification {
    NSLog(@"Entering Background");
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // paths[0];
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];
    //NSArray  *keys = [[NSArray alloc] initWithObjects:@"task", nil];
    NSMutableArray *array = [[NSMutableArray alloc] init];
    NSEnumerator *enumerator = [_tasks objectEnumerator];
    Task *tempTodo;
    while ( tempTodo = [enumerator nextObject])
    {
        [array addObject:tempTodo.name];
        [array addObject:@(tempTodo.done)];
    }
    [array writeToFile:plistPath atomically:YES];
}

Buraya kadar bir sorun yok.. En sonunda viewLoad ile to-doları geri yüklerken hepsini done olarak çekiyor..

NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // paths[0];
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];
    if ([fileManager fileExistsAtPath:plistPath] == YES)
    {
        NSMutableArray *readArray = [NSMutableArray arrayWithContentsOfFile:plistPath];
        _tasks = [[NSMutableArray alloc] init];
        NSEnumerator *enumerator = [readArray objectEnumerator];
        NSString *str = [[NSString alloc] init];
        while ( str = [enumerator nextObject])
        {
            Task *tempTodo = [[Task alloc] init];
            tempTodo.name = str;
            str = [enumerator nextObject];
            tempTodo.done = YES; // HATALI OLAN KISIM...
            [_tasks addObject:tempTodo];

        }
        [[self tableView] reloadData];
    }

Hatalı olan kısmı işaretledim.. Ancak bu sorunu nasıl düzeltebilirim. Yapmak istediği eğer to-do tamamlanmışsa tamamlanmış bir şekilde eğer tamamlanmamışsa tamamlanmamış bir şekilde tekrardan yüklemesi...

Umarım bilen biri çıkar ve yardımcı olur.. Şimdiden teşekkürler..

soruldu: 26 Mar '13, 12:18

Salieh's gravatar image

Salieh
2081014
cevap kabul oranı: 0%

değiştirildi: 28 Mar '13, 16:28

bu uygulama bir ios uygulamasımıdır yoksa mac uygulamasımı ?

(27 Mar '13, 04:48) dreampowder dreampowder's gravatar image

iOS uygualamasıdır.

(28 Mar '13, 14:41) Salieh Salieh's gravatar image

Ben normalde core-data ile veri kaydını tutarım, bir plist dosyasına kayıt işlemini daha önce denemedim ama oluşturduğunuz array bence biraz sıkıntılı. ben olsam şu şekilde kaydederim:

Kayıt için her satırda değerlerin bulunduğu bir string olşuturuyorum: burada verilerin arasındaki ayracı "///" olarak ayarladım, sen duruma göre bir ayraç ayarlayabillirsin...

for(Task* task in _tasks)
{
            NSString* taskData = [NSString stringWithFormat:@"%@///%@",task.name,task.done?@"YES":@"NO"];
            [array addObject:taskData];
}
[array writeToFile:plistPath atomically:YES];

Verileri toplarkende:

while ( str = [enumerator nextObject])
        {
            Task *tempTodo = [[Task alloc] init];
            NSArray* taskValues =     [str componentsSeparatedByString:@"///"];
            if([taskValues count]==2)   //Gerçekten iki eleman mı almışsız garanti olsun diye 
            {
                   tempTodo.name = [taskValues objectAtIndex:0];
                   tempTodo.done = [[taskValues objectAtIndex:1]boolValue];
            }
            [_tasks addObject:tempTodo];
            str = [enumerator nextObject];
        }

Kodu direkt buraya yazdım, o yüzden yazım hataları olması ihtimali var, umarım bir hata yapmamşımdır

permanent link

cevaplandı: 27 Mar '13, 05:13

dreampowder's gravatar image

dreampowder
3.3k112849
cevap kabul oranı: 23%

@dreampowder Dostum malesef olmadı. Done sorunu çözüldü. Ancak tam anlamamıyla sadece 2 değer alıyordu. Sonuçta bu bir to-do uygulaması olduğu için 2 den fazla task alması lazım. if kaldırıp denedim yine olmadı. Şuan sadece en son 2 task verisi çekiyor.

(28 Mar '13, 14:29) Salieh Salieh's gravatar image

@dreampowder ayrıca incelemek isterseniz diye projeyi upload ettim. Belki daha verimli olur.

(28 Mar '13, 14:44) Salieh Salieh's gravatar image

yarın bir bakayım... yanılz benim yazdığım kodda "sadece iki task verisi al" gibi bir alan yok. sorun benim yazığımdan çok sizin tableview da dataları nasıl koyup çektiğinizde..

(28 Mar '13, 15:24) dreampowder dreampowder's gravatar image

Sonunda Hallettim. Size teşekkür ederim.

(28 Mar '13, 15:41) Salieh Salieh's gravatar image

halettiğinize sevindim :)

(29 Mar '13, 03:48) dreampowder dreampowder's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×16
×12

Soruldu: 26 Mar '13, 12:18

Görüntüleme: 755 kez

Son güncelleme: 29 Mar '13, 03:48

powered by BitNami OSQA