Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/45.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 可编辑UITableView,单元格中的UITextField,按下“完成”时存储数据_Ios_Iphone_Objective C_Uitableview - Fatal编程技术网

Ios 可编辑UITableView,单元格中的UITextField,按下“完成”时存储数据

Ios 可编辑UITableView,单元格中的UITextField,按下“完成”时存储数据,ios,iphone,objective-c,uitableview,Ios,Iphone,Objective C,Uitableview,我已经为此绞尽脑汁一两天了,没法让它按我想要的方式工作。我试图模仿通讯录的联系人编辑页面(我知道以前有人问过它) 我有一个自定义UITableViewCell,其中包括一个UITextField,它与详细信息文本标签位于同一位置,当按下“编辑”按钮时,它们会隐藏和取消隐藏以显示正确的项目 我使用UITextFieldDelegate将文本字段中键入的信息存储到字典中,以便在用户单击“完成”时将它们保存到视图数组和我的核心数据模型中 现在的问题是: 如果在字段中输入文本,则不选择任何其他字段/单元

我已经为此绞尽脑汁一两天了,没法让它按我想要的方式工作。我试图模仿通讯录的联系人编辑页面(我知道以前有人问过它)

我有一个自定义UITableViewCell,其中包括一个UITextField,它与详细信息文本标签位于同一位置,当按下“编辑”按钮时,它们会隐藏和取消隐藏以显示正确的项目

我使用UITextFieldDelegate将文本字段中键入的信息存储到字典中,以便在用户单击“完成”时将它们保存到视图数组和我的核心数据模型中

现在的问题是: 如果在字段中输入文本,则不选择任何其他字段/单元格,并按“完成”,则更改的信息将被忽略,而不会存储在词典中

我的代码现在只在按下done时将字典的内容打印到NSLog,因为在字典的状态正确之前,我看不到更新单元格的意义

我列出了所有的UITextFieldDelegate方法,并在每件事情运行时打印日志,试图跟踪事情的进展情况,但这并没有帮助我了解这个具体问题

代码如下:

可编辑的CellStyle2.h

@interface EditableCellStyle2 : UITableViewCell {
    CGRect editRect;
    UITextField *editField;
}

@property (nonatomic, readonly, retain) UITextField *editField;

@end
EditibleCellStyle2.m

#import "EditableCellStyle2.h"

@implementation EditableCellStyle2

@synthesize editField;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code.
        editRect = CGRectMake(83, 12, self.contentView.bounds.size.width-83, 19);

        editField = [[UITextField alloc] initWithFrame:editRect];
        editField.font = [UIFont boldSystemFontOfSize:15];
        editField.textAlignment = UITextAlignmentLeft;
        editField.textColor = [UIColor blackColor];
        editField.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;

        [self.contentView addSubview:editField];

        self.editField.enabled = NO;
        self.editField.hidden = YES;
    }
    return self;
}

-(void)layoutSubviews
{
    [super layoutSubviews]; // layouts the cell as UITableViewCellStyleValue2 would normally look like

    editRect = CGRectMake(self.detailTextLabel.frame.origin.x, self.detailTextLabel.frame.origin.y, self.contentView.frame.size.width-self.detailTextLabel.frame.origin.x, self.detailTextLabel.frame.size.height);
    editField.frame = editRect;
}

- (void)willTransitionToState:(UITableViewCellStateMask)state {
    [super willTransitionToState:state];

    if (state & UITableViewCellStateEditingMask) {
        self.detailTextLabel.hidden = YES;
        self.editField.enabled = YES;
        self.editField.hidden = NO;
    }
}

- (void)didTransitionToState:(UITableViewCellStateMask)state {
    [super didTransitionToState:state];

    if (!(state & UITableViewCellStateEditingMask)) {
        self.editField.enabled = NO;
        self.editField.hidden = YES;
        self.detailTextLabel.hidden = NO;
        self.editField.text = self.detailTextLabel.text;
    }
}

- (void)dealloc {
    [editField release];

    [super dealloc];
}

@end
DetailViewController.h

#import <UIKit/UIKit.h>
#import "Entry.h"
#import "Station.h"
#import "EditableCellStyle2.h"

@interface EntryDetailViewController : UITableViewController <UITextFieldDelegate> {
    NSManagedObjectContext *currentContext;
    Entry *passedEntry;

    NSMutableArray *sectionsArray;
    NSMutableDictionary *editModeDict;
}

@property (nonatomic, retain) NSManagedObjectContext *currentContext;
@property (nonatomic, retain) Entry *passedEntry;

-(void)editPressed;
-(void)donePressed;
-(void)cancelPressed;

@end
试试这个:

创建一个方法

  -(NSString *)getInEditTextFieldValue
  {
      if([myTextField isFirstResponder])
     {
           // get the text of myTextField and set it to text.
           return myTextField.text;
     }
     else
     {
           return nil;
     }
  }
在你的Done Pressed中:

  -(void)donePressed
  {
        NSString* myText = [self getInEditTextFieldValue];

        if(myText != nil)
        {
              // add myText to your dictionary
        }

        // save logic goes here...

        // reload data for table view...
  }
我现在不在mac电脑上,所以我不能尝试代码,但逻辑对我来说很有效。UITextFieldDelegate方法应该拾取所有文本字段的值,第一个响应者除外。你需要做的是多做一点工作来检查并获得值


希望这能对您有所帮助。

您需要首先在
UITableCell
中正确引用文本字段。然后单击“完成”按钮方法,您还可以获得单元对象。基于您的类型对象的
contentView
(在您的类型
UITextField
)可以获得&您可以从中获得文本。这样,您就可以更新所有字段的数据库。

您的doneButton()在textFieldShouldEndEditing之前被调用。尝试更改响应程序,您将看到一个在执行按钮单击时处于活动状态的响应程序将不会保存其数据。

您在哪里分配/init editModeDict?您确定调用了[editModeDict setValue:forKey:]吗?NSLog()的输出是什么?哈,遗漏了那部分。editModeDict在viewDidLoad中获取alloc和init。它确实有效。我似乎是通过将[self.view.window-endEditing:YES]放在上面来工作的;在我的donePressed方法的开头,该方法使所有已编辑但仍然是第一响应者的文本字段通过其最终编辑方法,从而更新词典。如何直接打印NSDictionary内容。您需要循环遍历所有键并打印相应的值。您可以将字典作为对象打印到NSLog进行测试<代码>NSLog(@“%@”,aDictionary)工作正常。
  -(void)donePressed
  {
        NSString* myText = [self getInEditTextFieldValue];

        if(myText != nil)
        {
              // add myText to your dictionary
        }

        // save logic goes here...

        // reload data for table view...
  }