自定义初始化方法不起作用

Posted

技术标签:

【中文标题】自定义初始化方法不起作用【英文标题】: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 有史以来最糟糕的方法名称。 谢谢 :) 这样更容易跟踪我在做什么。 【参考方案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 子类)一起使用。

以上是关于自定义初始化方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UITableViewCell 初始化在 initWithCoder 中不起作用

在 SKSpriteNode 中调用自定义方法不起作用

Visual Studio 自定义代码片段在方法定义的参数列表中不起作用

自定义登录在 Spring 中不起作用

codeigniter 自定义 404 页面不起作用

使用 templatetags 方法的 Django 自定义过滤器不起作用!异常值为:无效过滤器:'dict_'