设置另一个UIViewController的属性

时间:2013-11-06 12:21:00

标签: ios properties uiviewcontroller parameter-passing

在我的DetailViewController.h中,我已经声明了属性*类型,如下所示:

@interface DetailViewController : UIViewController
    @property (strong, nonatomic) NSString *type;
@end

然后我得到了一个ListViewController,它是一个包含TableView的UIViewController。 ListViewController.h如下所示:

@interface ListViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@end

在我的ListViewController.m中我想更改* type a的值我很快切换View(视图切换工作正常)。

我这样做是通过添加以下内容来实现的:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UINavigationController * navigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailController"];
    DetailViewController * detailController = [[DetailViewController alloc] init];

    detailController.type = @"video";

    NSLog(@"Type: %@", detailController.type);

    [self.navigationController pushViewController:navigationController animated:YES];
}

当我在这个块/函数的第二行放置一个断点时,我得到了带有* type的detailController。 当我NSLog这几行后,它返回“(null)”。 视图已更改,但未设置类型。

我无法弄清楚我做错了什么? 有人为此解决了这个问题,或者能指出一些我们对此的解释吗?

因为我尝试搜索答案,但找不到与我的问题相同的内容,或者我使用了错误的搜索字词。

5 个答案:

答案 0 :(得分:1)

这是为了什么?

UINavigationController * navigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailController"];

为什么要在导航控制器内推送导航控制器?

[self.navigationController pushViewController:navigationController animated:YES];

detailController未被使用或显示。

请改为尝试:

[self.navigationController pushViewController:detailController animated:YES];

答案 1 :(得分:1)

看看最后一行 - 你告诉导航控制器推动自己!

答案 2 :(得分:1)

didSelectRowAtIndexPath:方法中更改以下行

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    DetailViewController * detailController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailController"];;

    detailController.type = @"video";

    NSLog(@"Type: %@", detailController.type);

    [self.navigationController pushViewController: detailController animated:YES];
}`
在你的故事板中选择DetailViewController并将故事板ID作为“DetailController”。确保ListViewController嵌入UINavigationController,您可以选择ListViewController并转到editor->Embed in->Navigation Controller。请按照以下步骤解决您的问题。

或者您可以将ListViewController中的segue提供给DetailViewController并使用

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *path = [self.tableView indexPathForSelectedRow]; //create tableview outlet
    [segue.destinationViewController setType:@"video"];
}

答案 3 :(得分:0)

应该是这样的

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailViewController * detailController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailController"];

    detailController.type = @"video";

    NSLog(@"Type: %@", detailController.type);

    [self.navigationController pushViewController:detailController animated:YES];
}

答案 4 :(得分:0)

导航控制器和alloc-init方法是否都实例化了保存视图控制器??

如果是,请尝试此

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController * detailController = [[DetailViewController alloc] init];

detailController.type = @"video";

NSLog(@"Type: %@", detailController.type);

[self.navigationController pushViewController:detailController animated:YES];
}