自定义初始化方法不起作用
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 中不起作用