-1

私はストーリーボードと動的 UITableView を使用して、以下のようにセルを追加しています。このテキストを各セルの UITextField や UISwitch 状態などに保存する方法を知る必要があるため、上下にスクロールしてもデータは失われません。また、アプリを閉じたときに、再度開いたときに入力したデータを表示する必要があります。私はプログラミングを始めたばかりで、これが私の最初の UItableView プロジェクトです。コーディング例は素晴らしいでしょう。できるだけ詳しく教えてください! 前もって感謝します!

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

    // Make cell unselectable and set font.
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.textLabel.font = [UIFont fontWithName:@"ArialMT" size:13];

if (indexPath.section == 0) {

    UITextField* tf = nil;
    switch ( indexPath.row ) {
        case 0: {
            cell.textLabel.text = @"Name" ;
            tf = nameFieldTextField = [self makeTextField:self.name placeholder:@"John Appleseed"];
            nameFieldTextField.tag = 1;
            [cell addSubview:nameFieldTextField];
            break ;
        }
        case 1: {
            cell.textLabel.text = @"Address" ;
            tf = addressFieldTextField = [self makeTextField:self.address placeholder:@"Street Address"];
            addressFieldTextField.keyboardType = UIKeyboardTypeNumbersAndPunctuation;
            [cell addSubview:addressFieldTextField];
            break ;
        }
        case 2: {
            cell.textLabel.text = @"Email" ;
            tf = emailFieldTextField = [self makeTextField:self.email placeholder:@"example@gmail.com"];
            emailFieldTextField.keyboardType = UIKeyboardTypeEmailAddress;
            [cell addSubview:emailFieldTextField];
            break ;
        }
        case 3: {
            cell.textLabel.text = @"Phone" ;
            tf = phoneFieldTextField = [self makeTextField:self.phone placeholder:@"xxx-xxx-xxxx"];
            phoneFieldTextField.keyboardType = UIKeyboardTypePhonePad;
            phoneFieldTextField.tag = 10;
            phoneFieldTextField.text = [self formatPhoneNumber:phoneFieldTextField.text deleteLastChar:YES];
            [cell addSubview:phoneFieldTextField];
            break ;
        }
        case 4: {
            cell.textLabel.text = @"DOB" ;
            tf = dateOfBirthTextField = [self makeTextField:self.dateOfBirth placeholder:@"xx/xx/xxxx"];
            dateOfBirthTextField.keyboardType = UIKeyboardTypeNumbersAndPunctuation;
            [cell addSubview:dateOfBirthTextField];
            break ;
        }

    }
    // Textfield dimensions
    tf.frame = CGRectMake(120, 12, 170, 30);

    // Workaround to dismiss keyboard when Done/Return is tapped
    [tf addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];
4

6 に答える 6

4

データを格納するためのモデル オブジェクトを作成できると思います。

.h ファイル

@interface User : NSObject <NSCoding>

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *address;
@property (nonatomic, copy) NSString *email;
@property (nonatomic, copy) NSString *phone;
@property (nonatomic, copy) NSString *dob;

- (void)save;
+(User *)savedUser; 

.m ファイル

#define kName    @"Name"
#define kAddress @"Address"
#define kEMail   @"EMail"
#define kPhone   @"Phone"
#define kDOB     @"DOB"

#define kSavedUser @"SavedUser"

@implementation User

- (void)encodeWithCoder:(NSCoder *)encoder{

    [encoder encodeObject:self.name     forKey:kName];
    [encoder encodeObject:self.address  forKey:kAddress];
    [encoder encodeObject:self.email    forKey:kEMail];
    [encoder encodeObject:self.phone    forKey:kPhone];
    [encoder encodeObject:self.dob      forKey:kDOB];

}

- (id)initWithCoder:(NSCoder *)decoder{
    self = [super init];
    if (self) {
        self.name       = [decoder decodeObjectForKey:kName];
        self.address    = [decoder decodeObjectForKey:kAddress];
        self.email      = [decoder decodeObjectForKey:kEMail];
        self.phone      = [decoder decodeObjectForKey:kPhone];
        self.dob        = [decoder decodeObjectForKey:kDOB];
    }

    return self;
}

#pragma mark - Save

- (void)save{

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self];
    [defaults setObject:data forKey:kSavedUser];
    [defaults synchronize];
}

+(User *)savedUser{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [defaults objectForKey:kSavedUser];
    return [NSKeyedUnarchiver unarchiveObjectWithData:data];
}

UITableView データソース

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier
                                                            forIndexPath:indexPath];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.detailTextField.delegate = self;
    [cell.detailTextField setTag:indexPath.row+1];

    switch (indexPath.row+1) {
        case 1:{
            cell.titleLabel.text = @"Name";
            cell.detailTextField.text = self.user.name;
            break;
        }
        case 2:{
            cell.titleLabel.text = @"Address";
            cell.detailTextField.text = self.user.address;
            break;
        }
        case 3:{
            cell.titleLabel.text = @"EMail";
            cell.detailTextField.text = self.user.email;
            break;
        }
        case 4:{
            cell.titleLabel.text = @"Phone";
            cell.detailTextField.text = self.user.phone;
            break;
        }
        case 5:{
            cell.titleLabel.text = @"D.O.B.";
            cell.detailTextField.text = self.user.dob;
            break;
        }

        default:
            break;
    }

    return cell;
}

説明するには多すぎます。ソースコードを添付しましたので、ご覧ください。 ソースコード

于 2013-06-07T14:36:50.583 に答える
0

ある種の永続性を追加する必要があります。非常に少量のデータがあるように見えるので、NSDictionary の writeToFile:atomically: メソッドを使用して、テーブルのデータを NSDictionary オブジェクト内に配置する必要があります。NSDictionary のクラス メソッド dictionaryWithContentsOfFile: を使用してデータをロードし、画像を保存した場所をパラメーターとして渡します。

于 2013-05-31T19:00:26.913 に答える
0

まず、アプリからデータを保存するには、Core Data または NSUserDefaults を使用できます。NSUserDefaults は、少量のデータを保存するために使用する必要があります。

cellForRowAtIndexPathしかし、間違って実装されているため、メソッドを書き直す必要があります。

最初dequeueReusableCellWithIdentifierに、既に作成されたセルがあるかどうかを確認するために使用します (セルの再利用について聞いたことがあるかもしれませんが、これがその方法です)cellForRowAtIndexPathが呼び出されるたびに新しいセルを作成しているためです (セルが表示されるたびに呼び出されるメソッド)画面にアップします)。

次に、dequeueReusableCellWithIdentifierメソッドが返したセルが nil かどうかを確認した後、nil の場合は新しいセルを作成し、そうでない場合は返されたセルを使用します。

UITextField3 番目に、またはを持つことができるカスタム セルを作成し、のテキストを確認します。UISwitchnilの場合はプレースホルダーを設定し、そのままにしておくと、テーブルをスクロールしたときにデータが適切に表示されます。cellForRowAtIndexPathUITextField

第4に、UITextFieldsユーザーが編集を開始/終了するときに呼び出されるデリゲートメソッドがあるため、追加する必要がないため[tf addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];、UITextFieldDelegateプロトコルを確認してください(簡単なGoogleのもの:))

5番目 (私が約束する最後のもの) は、コードの同じ行で使用しないでください=。見苦しく、読みにくいです ( tf = nameFieldTextField = [self makeT...)

于 2013-05-31T19:00:56.897 に答える
0

データを sqlite データベースに保存できます。または、読み込まれたビューで 1 つの配列を取得することもできます。最初に null 値を挿入します。セルが作成されたら、その uitableviewcell オブジェクトからその null オブジェクトを置き換えます。セルをロードします。その配列から直接データを取得できます。

于 2013-05-31T19:06:30.170 に答える
0
    nsmutablearray *arr=[[nsmutablearray alloc] init];
    [arr addobject:[nsnull class]];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:customCellIdentifier];
                cell = [[[NSBundle mainBundle]loadNibNamed:@"cell" owner:self options:nil]objectAtIndex:0];
                cell.selectionStyle=UITableViewCellSelectionStyleNone;
                if (![[saveCellState objectAtIndex:indexPath.row] isKindOfClass:[NSNull class]])
                {
                    cell=(UITableViewCell *)[saveCellState objectAtIndex:indexPath.row];
                }
                if ([[saveCellState objectAtIndex:indexPath.row] isKindOfClass:[NSNull class]])
                {
}
于 2013-06-05T18:29:55.550 に答える