0

誰かが私がここでどこが間違っているのかを理解するのを手伝ってくれることを願っています

TableViewControllerがあり、テーブルビューの内容を保存するために、-(void)viewDidLoadコードを変更して[保存]ボタンを追加しました...

- (void)viewDidLoad
{
  [super viewDidLoad];

  self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] 
                                           initWithBarButtonSystemItem:UIBarButtonSystemItemSave 
                                           target:self 
                                           action:@selector(insertCustomData)
                                           ];

ただし、insertCustomData関数内では、コントローラーコード内の他の場所と同じようにテーブルビューにアクセスする必要があります。データベースに保存する前にセル値を検証するために、テーブルビューにアクセスする必要があります。ツールバー定義からテーブルビューへの参照を渡す方法を確認できます(そうする必要がある場合)

この段階でテーブルビューセルの値にアクセスする必要があるかどうかさえわかりません(セルデータのNSObjectを作成して、作成したデータコントローラーの検証関数に渡して検証しようとしています)そしてSQLiteデータベースに保存します)

これが些細なことのように思われる場合は申し訳ありませんが、今私はこれに固執しています、そしてどんな助けもいただければ幸いです

ありがとう

[アップデート]

データ入力画面にtableViewを使用しているので、最初は表示するデータがありません。tableViewはtableviewコントローラーの範囲内にありますが、それを行う必要があるため、カスタムセル定義(.xibファイル内で.hおよび.mファイルが関連付けられている)を使用して実行時にセルを作成しています。 。カスタムセル定義は、1つのUILabelと1つのUITextField(データ入力に使用される)です。

フィールドには、入力する必要があるものを示すプレースホルダーがありますが、それ以外の場合は空です。ユーザー入力をキャプチャするために、tableViewを配列またはディクショナリオブジェクトに基づく必要があるかどうかを検討しました

これを書いているクラスには定義があります@interface ViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>。これはUITableViewController初期テンプレート(またはその呼び出されたもの)から作成されたためです。

以前にデータをキャプチャし、セレクターからsaveメソッドのみを呼び出す必要があると感じましたか?

nil NSStringsを使用してNSArrayを作成し、これをtableViewの各UITextField / Cellに割り当てる必要がありますか?もしそうなら、テキストエントリはこのNSArrayに入りますか?

[解決済み-以下の回答]

私が必要としたのは、標準の.hファイルをこれに変更することでした

@interface CustomViewController : UITableViewController  <UITextFieldDelegate> {
  IBOutlet UITableView *MyTableView;
}

@property(nonatomic, retain) IBOutlet UITableView *MyTableView;

次に、Interface Builderで、テーブルビューを新しい宣言にCtrlキーを押しながらリンクすることができました。これは最も重要なステップでした。これにより、一般的なtableViewではなく、セルを動的に構築するメインコードを変更して、これを参照できるようになりました。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"EditableCustomCell";
  EditableCustomCell *cell = [[self MyTableView] dequeueReusableCellWithIdentifier:CellIdentifier];

synthesize MyTableView上部にもを追加しました

これによりMyTableView、作成する必要のある新しいメソッドにアクセスできるようになり、leftBarButtonItemセレクターから簡単にアクセスできるようになりましたinsertCustomData

これを手伝ってくれたKimpoyに感謝します!

(注:皮肉なことに、これを完了した後、私が投稿した前の質問を見ると、セグエとテーブルビューに関する以前の問題から学ぶ必要があります。セグエ中にビューコントローラーからtableViewを参照する方法

4

2 に答える 2

1

AddViewController.h ファイルで:

@interface AddViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate> {
    UITableView             *tableViewInfo;
    UITextField             *txtFieldUsed;
}

@property (nonatomic, retain) IBOutlet UITableView *tableViewInfo;
@end

AddViewController.m ファイルで:

@implementation AddViewController

@synthesize tableViewInfo; // Synthesize your tableViewInfo property

// Called to get the text values from the textfields in the table view cells/rows
- (NSDictionary *)getValueForTextField:(UITableView *)tableView {
    NSMutableDictionary *mutDictCredential = [[[NSMutableDictionary alloc] init] autorelease];
    for (int row = 0; row < 2; row++) {
        NSIndexPath *idxCell = [NSIndexPath indexPathForRow:row inSection:0];
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:idxCell];
        for (UITextField *textField in cell.contentView.subviews) {
            if ([textField isKindOfClass:[UITextField class]] && row == textField.tag) {
                NSString *strText = textField.text;
                if (!strText) {
                strText = @"";
                }
                if (row == 0) {
                [mutDictCredential setObject:strText forKey:@"CoffeeName"];
                }
                else if (row == 1) {
                [mutDictCredential setObject:strText forKey:@"Price"];
                }
            }
        }
    }
    return mutDictCredential;
}

#pragma mark -
#pragma mark Tableview datasource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 2;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *CellIdentifier = @"CellIdentifier";
    UITableViewCell *cell = [[self tableViewInfo] dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil){
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        CGRect rect = [cell frame];
        // Create editable textfield within cell or row
        UITextField *txtField = [[UITextField alloc] initWithFrame:CGRectMake(rect.origin.x + 10, rect.origin.y, rect.size.width - 40, rect.size.height)];
        [txtField setAutocorrectionType:UITextAutocorrectionTypeNo];
        [txtField setAutocapitalizationType:UITextAutocapitalizationTypeNone];
        [txtField setTextAlignment:UITextAlignmentLeft];
        [txtField setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];
        [txtField setTag:indexPath.row];
        [txtField setDelegate:self];

        // Set cells texts
        switch ([txtField tag]) {
          case 0:
            [txtField setPlaceholder:@"Coffee Name"];
            [txtField setKeyboardType:UIKeyboardTypeDefault];
            [txtField setReturnKeyType:UIReturnKeyNext];
            break;
          case 1:
            [txtField setPlaceholder:@"Price"];
            [txtField setKeyboardType:UIKeyboardTypeDecimalPad];
            break;
          default:
            break;
        }
        [[cell contentView] addSubview:txtField];
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
        [txtField release];
     }
    return cell;
}

#pragma mark -
#pragma mark Tableview delegate

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 20.0;
}

// This can be your insertCustomData
- (void) save_Clicked:(id)sender {
    // Get data from table
    [self getValueForTextField:[self tableViewInfo]];

    NSMutableDictionary *tempMutDictInfo = [[NSMutableDictionary alloc] initWithDictionary:[self getValueForTextField:[self tableViewInfo]]];

    NSString *paramName = [tempMutDictInfo valueForKey:@"CoffeeName"];
    NSString *paramMessage = [tempMutDictInfo valueForKey:@"Price"];
    [tempMutDictInfo release];

    NSMutableDictionary *mutDictInfo = [[NSMutableDictionary alloc] init];
    [mutDictInfo setObject:paramName == nil ? @"" : paramName forKey:@"CoffeeName"];
    [mutDictInfo setObject:paramMessage == nil ? @"" : paramMessage forKey:@"Price"];

    // Database
    SQLAppDelegate *appDelegate = (SQLAppDelegate *)[[UIApplication sharedApplication] delegate];

    //Create a Coffee Object.
    Coffee *coffeeObj = [[Coffee alloc] initWithPrimaryKey:0];
    coffeeObj.coffeeName = [mutDictInfo valueForKey:@"CoffeeName"];
    NSDecimalNumber *temp = [[NSDecimalNumber alloc] initWithString:[mutDictInfo valueForKey:@"Price"]];

    [mutDictInfo release];

    coffeeObj.price = temp;
    [temp release];
    coffeeObj.isDirty = NO;
    coffeeObj.isDetailViewHydrated = YES;

    //Add the object
    [appDelegate addCoffee:coffeeObj];

    //Dismiss the controller.
    [self.navigationController dismissModalViewControllerAnimated:YES];
}

- (void)dealloc {
    [tableViewInfo release];
    [super dealloc];
}

@end

これを参考にしてください。

于 2012-06-13T19:00:49.570 に答える
0

ビュー コントローラーに 2 つの追加プロパティを割り当てます。テーブルビューに 1 つ、データソースに 1 つ。

于 2012-06-13T14:43:25.827 に答える