0

UITableViewペン先からロードされたカスタム セルを含むプログラムがあります。これらのセルにはテキストフィールドとUIImage. それらに含まれる情報をカスタムクラスに渡し、データの永続性のためにクラスをエンコード/デコードしています。データをロードしたいときは、クラスからの情報をセルに入れます。これは 1 つのセルに対しては正常に機能しますが、複数のセルに対しては機能しません。確認しましたが、クラスは正しくファイルに書き込まれています。

これは私の検索方法です:

//Fills an array if the file exists, otherwise returns nil
- (NSMutableArray*) findFile: (NSString *) add
{
    if ([[NSFileManager defaultManager] fileExistsAtPath:[self saveFilePath:add]])
    {
        NSString *temp = [add stringByAppendingString:@"dat"];
        namesIndexer = [[NSMutableArray alloc] initWithContentsOfFile:[self saveFilePath:temp]];

        if (namesIndexer == nil) return nil;

        NSMutableArray *thing = [NSMutableArray new];
        for (NSString *place in namesIndexer)
        {
            temp = [add stringByAppendingString:place];
            PTextHolder *p = [NSKeyedUnarchiver unarchiveObjectWithFile:[self saveFilePath:temp]];
            [thing addObject:p];
        }
        return thing;
    }
    else 
    {
        return nil;
    }
}

これは別のクラスにあり、ホルダーからメソッドを呼び出すことに注意してください。

//Returns a cell to be used at a row, populates it from the holder object
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    static NSString *personCellId = @"personID";
    UINib *nib = [UINib nibWithNibName:@"PersonCell" bundle:nil];
    [tableView registerNib:nib forCellReuseIdentifier:personCellId];
    PersonCell *cell = [tableView dequeueReusableCellWithIdentifier:personCellId];

    cell.owner = tableView;
    if (mineTable == nil) mineTable = tableView;
    cell.delegated = formDataStorage;

    [formDataStorage putWhatShouldBeInThisCellForThisRowInIt:cell:(int*)indexPath.row];

    cell.currentRow = [[NSNumber alloc] initWithInt:indexPath.row];

    return cell;
}

呼び出すメソッドは次のとおりです。

- (void) putWhatShouldBeInThisCellForThisRowInIt: (PersonCell *) someCell: (int *) someRow
{
    if ((NSUInteger) someRow >= cake.count)
    {
        NSLog(@"The cake has been undercooked");
        return;
    }

    PTextHolder *temp = [cake objectAtIndex:(NSUInteger) someRow];

    someCell.firstName.text = temp.first;
    someCell.lastName.text = temp.last;
    someCell.middleName.text = temp.middle;
    someCell.suffixName.text = temp.suffix;
    someCell.email.text = temp.email;
    someCell.theSignature.image = temp.sig;
}

ここで何か問題があるように見えますか? セルが 1 つだけ読み込まれる原因になりますか?

4

1 に答える 1

1

最初に配列内のアイテムの数を確認します

[配列数]

、アイテムの数が1に等しい場合、問題はエンコード/デコードで推測したとおりです。

そうでない場合、コードは正しく、セルをロードするコードに問題があります。

ちなみに、「cellInfoClass」の配列を直接保存しないのはなぜですか:

[NSKeyedArchiver archiveRootObject:array toFile:filePath]

配列を直接取得します。

クラスにエンコード/コーディングコードを既に追加していると思いますが、そうでない場合は次のようになります。

/**  
 * Returns an object initialized from data in a given unarchiver. (required)  
 *  
 * @param decoder: An unarchiver object.  
 */
- (id)initWithCoder:(NSCoder *)coder {
    if (self = [super init]) {      
    // If parent class also adopts NSCoding, replace [super init]
    // with [super initWithCoder:decoder] to properly initialize.       
       [self setName:[coder decodeObjectForKey:@"name"]];       
       [self setId:[coder decodeIntForKey:@"id"]];      
       [self setDomain:[coder decodeObjectForKey:@"domain"]];   
    }
    return self;     
 }


/**  
 * Encodes the receiver using a given archiver. (required) 
 * @param coder: An archiver object.  
 */
- (void)encodeWithCoder:(NSCoder *)coder{
    // If parent class also adopts NSCoding, include a call to
    // [super encodeWithCoder:encoder] as the first statement.  
    [coder encodeObject:name forKey:@"name"];
    [coder encodeInt:id forKey:@"id"];
    [coder encodeObject:domain forKey:@"domain"];
}
于 2012-06-25T17:47:38.350 に答える