17

我有一个核心数据应用程序,它使用导航控制器深入查看详细信息视图,然后如果您在详细信息视图中编辑其中一行数据,您将被带到该单行的编辑视图,如 Apples CoreDataBooks示例(除了 CoreDataBooks 仅使用 aUITextField本身,而不是UITableViewCell像我这样的子视图)!

编辑视图是以编程方式在单元格UITableviewController中创建具有单个部分单行和 a 的表。UITextfield

我想要发生的是当您选择要编辑的行并且编辑视图被推送到导航堆栈并且编辑视图动画在屏幕上移动时,我希望将文本字段选为 firstResponder 以便键盘已经显示随着视图在屏幕上移动以占据位置。就像在联系人应用程序或 CoreDataBooks 应用程序中一样。

我目前在我的应用程序中有以下代码,它会导致视图加载,然后你会看到键盘出现(这不是我想要的,我希望键盘已经在那里)

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [theTextField becomeFirstResponder];
}

你不能把它放进去,-viewWillAppear因为文本字段还没有被创建,所以theTextField是 nil。在他们实现我想要的CoreDataBooks应用程序中,他们从笔尖加载他们的视图,因此他们使用相同的代码,但-viewWillAppear已经创建了文本字段!

无论如何在不创建笔尖的情况下解决这个问题,我想保持实现程序化以实现更大的灵活性。

非常感谢

4

4 回答 4

16

在与 Apple 开发支持团队交谈后,我有了答案!

您需要做的是在屏幕外创建一个UITextField-(void)loadView;然后将其设置为第一响应者,然后在viewDidLoad您可以将其设置为第一响应者的方法UITextFieldUITableViewCell。这是一些示例代码(请记住,我正在这样做,UITableViewController所以我也在创建表格视图!

- (void)loadView
{
    [super loadView];

    //Set the view up.
    UIView *theView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.view = theView;
    [theView release];

    //Create an negatively sized or offscreen textfield
    UITextField *hiddenField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, -10, -10)];
    hiddenTextField = hiddenField;
    [self.view addSubview:hiddenTextField];
    [hiddenField release];

    //Create the tableview
    UITableView *theTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] bounds] style:UITableViewStyleGrouped];
    theTableView.delegate = self;
    theTableView.dataSource = self;
    [self.view addSubview:theTableView];
    [theTableView release];

    //Set the hiddenTextField to become first responder
    [hiddenTextField becomeFirstResponder];

    //Background for a grouped tableview
    self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    //Now the the UITableViewCells UITextField has loaded you can set that as first responder
    [theTextField becomeFirstResponder];
}

我希望这可以帮助任何与我处于同一位置的人!

如果其他人可以看到更好的方法来做到这一点,请说。

于 2010-04-22T14:36:23.247 回答
5

尝试在 viewDidAppear 方法中执行此操作,对我有用。

于 2011-09-03T08:10:30.503 回答
3

init我认为显而易见的解决方案是在视图控制器的方法中创建文本字段。这通常是您配置视图的地方,因为视图控制器确实需要填充的视图属性。

然后您可以将文本字段设置为第一响应者,viewWillAppear并且当视图滑入时键盘应该可见。

于 2010-04-17T13:44:13.533 回答
2

您是否尝试过使用 uinavigationcontroller 委托方法?:

导航控制器:willShowViewController:动画:

于 2010-04-18T22:21:22.197 回答