【问题标题】:Custom Init Method not working自定义初始化方法不起作用
【发布时间】:2013-12-19 19:58:39
【问题描述】:

我正在尝试通过单击单元格来填充 UITableViewController 中的 UITextFields。因此,我创建了一个 init 方法,例如:

- (id)initWithObjetoFormulario:(ObjetoFormularioGerenciador *)umObjeto
{
    self = [super init];
    if(self){
        self.objetoFormulario = umObjeto;
            }
    return self;
}

在我的ViewDidLoad 中,我输入了if(self.objetoFormulario){ 行,然后将 UITextFields 链接到我的对象。我不认为在这一点上有什么问题。

所以,我的第二个 TableViewController 是一个 SearchDisplayController,它可以找到我需要的数据,并且在 didSelectRowAtIndexPath 我有:

ObjetoFormularioGerenciador *objeto = [[ObjetoFormularioGerenciador alloc] init];
    [objeto RecebeArrayComDadosECriaObjetoFormularioGerenciador:_arrayComDados eEmail:  [searchResults objectAtIndex:indexPath.row]];

   GerenciarSeriesTableViewController *gerenciador = [[GerenciarSeriesTableViewController  alloc] initWithObjetoFormulario:objeto];
    [self.navigationController pushViewController:gerenciador animated:NO];

由于我的单元格中没有实际的对象,我调用了一个方法来根据单元格条目检索对象,这也可以正常工作,现在,当我单击单元格时它会打开一个空白的 TableView。它应该使用包含 UITextField 的静态单元格返回到我的 tableView 并填充它们。

当我使用这段代码时:

ObjetoFormularioGerenciador *objeto = [[ObjetoFormularioGerenciador alloc] init];
[objeto RecebeArrayComDadosECriaObjetoFormularioGerenciador:_arrayComDados eEmail:[searchResults objectAtIndex:indexPath.row]];

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
GerenciarSeriesTableViewController *gerenciador = [sb instantiateViewControllerWithIdentifier:@"GerenciarSeriesTableViewController"];
[self.navigationController pushViewController:gerenciador animated:NO];

它确实打开了我想要的 TableView,但它没有填充 UITextFields,因为我没有传递任何对象。

谢谢。

【问题讨论】:

  • RecebeArrayComDadosECriaObjetoFormularioGerenciador:eEmail 有史以来最糟糕的方法名称。
  • 谢谢 :) 这样更容易跟踪我在做什么。

标签: ios objective-c uitableview storyboard


【解决方案1】:

是的,您确实通常没有自定义的 init 视图控制器方法,而是依赖于标准的方法,然后一旦实例化视图控制器,您只需设置属性,例如:

ObjetoFormularioGerenciador *objeto = ... // create and configure objeto

GerenciarSeriesTableViewController *gerenciador = [self.storyboard instantiateViewControllerWithIdentifier:@"GerenciarSeriesTableViewController"];
gerenciador.objetoFormulario = objeto;
[self.navigationController pushViewController:gerenciador animated:NO];

你也可以在两个视图控制器之间有一个segue,给它一个标识符,然后调用[self performSegueWithIdentifier:...],然后在prepareForSegue方法中设置objetoFormulario。但是上述技术也应该可以正常工作。

【讨论】:

  • 完美,效果很好。不过,关于自定义初始化方法,不是经常使用吗?只是好奇。谢谢。
  • @Jorge 在基于 NIB 的项目中,您可以使用自定义 init 方法(调用标准 initWithNibName:bundle:)。但是在故事板世界中,您经常让故事板或 segue 实例化视图控制器和子视图,因此使用自定义 init 方法没有意义。但是 iOS 5 引入了prepareForSegue,让您可以使用标准的initWithCoder,但提供了将数据传递到目标控制器的机制。因此,对于故事板,您通常不会将自定义 init 方法与视图控制器(或任何 UIKit 子类)一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2020-01-02
相关资源
最近更新 更多