2012-06-13 71 views
0

的選擇方法來訪問的TableView我希望有人在那裏可以幫助我理解我要去哪裏錯在這裏如何從工具欄

我有一個TableViewController,爲了節省的tableview的內容,我「VE改變了 - (無效)viewDidLoad中的代碼添加一個保存按鈕...

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

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

但是,我insertCustomData函數中,我需要訪問的tableview,我會在控制器代碼中的其他地方。我需要訪問我的tableview才能在保存到數據庫之前驗證單元格值。我可以看到如何從工具欄定義中傳遞對tableview的引用(如果這是應該如何完成的)

我甚至不確定我是否應該在此階段訪問tableview單元格的值(I我試圖構建一個NSObject的單元格數據傳遞給我寫的數據控制器中的驗證函數,以驗證並保存到SQLite數據庫中)

對不起,如果這看起來微不足道,但現在我'米停留在這一點,任何幫助,將不勝感激

感謝

[更新]

我正在使用tableView作爲數據輸入屏幕,所以最初沒有要顯示的數據。 tableView在tableview控制器的範圍內,但由於我需要這樣做,我在運行時使用自定義單元格定義(在.xib文件中,使用相關的.h和.m文件)創建單元格, 。自定義單元定義只是一個UILabel和一個UITextField(用於數據輸入)

這些字段包含佔位符,用於指示需要輸入的內容,但其他位置爲空。我仔細考慮過是否仍然需要將tableView放在數組或字典對象上以捕獲用戶輸入

我寫這個的類定義了@interface ViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>,因爲這是從UITableViewController初始模板創建的它叫)

我感覺我應該更早捕獲數據,只調用選擇器的保存方法?

我只需要創建一個帶有nil NSStrings的NSArray,並將它分配給tableView中的每個UITextField/Cell?如果我這樣做,文本輸入是否會進入這個NSArray?

[解決 - 以下答案]

我需要的是修改標準.h文件中這一

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

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

然後在界面生成器,我能夠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本作中的幫助!

(注:諷刺的是完成此,看前一個問題我張貼後,我應該從我以前的問題與塞格斯和tableviews How to reference tableView from a view controller during a segue學會)

+0

jeeeezzz ...感謝特別提到,男人!沒想到。我只是想幫忙。嘿嘿...它使我的一天! – Kimpoy

回答

1

[編輯]

下面是使用SQLite一個很好的教程。只需點擊這個link。下載示例項目。但是,對其原始代碼進行一些調整,以便使用tableview處理它。

在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 

您可以使用此作爲參考。希望有所幫助!

+0

謝謝Kimpoy,我已更新原始文本並更新了您的問題。希望你能幫到 –

+0

只要讓我知道你是否遇到過任何問題。祝你好運! – Kimpoy

+0

很棒!非常感謝Kimpoy。我大部分時間都在那裏,但是代碼確實幫助我解決了這些問題。我會用更詳細的答案來更新我的問題以獲得完整性 –

0

我會分配2個附加屬性,以我的視圖控制器。 1爲我的tableview和1爲我的數據源。

+0

感謝您的回覆,但我不確定您所指的是什麼,您能更具體一點嗎? –