【问题标题】:Access property from different View controller's从不同的视图控制器访问属性
【发布时间】:2013-01-07 23:54:39
【问题描述】:

我在我的一个视图控制器中有一个这样声明的属性:

@property (nonatomic, 保留) MPMusicPlayerController *musicPlayer;

如何从其他视图控制器访问此属性?请记住,我使用的是故事板,而不是以编程方式加载视图。

我对此有点陌生……谢谢。

详情

我的根视图控制器中嵌入了一个 TableViewController,其中包含该属性。然后我有另一个从根视图控制器推送的视图控制器。推送此视图时,我希望调用 [musicPlayer play],但现在它无法识别 musicPlayer。

【问题讨论】:

    标签: objective-c ios cocoa-touch uiviewcontroller


    【解决方案1】:

    您需要使用其他控制器的 musicPlayer 属性获取对视图控制器的引用。你如何得到它取决于两个控制器是如何相关的。一个呈现另一个?一个推到另一个?一个是另一个的孩子吗?这些不同的关系需要不同的方式来访问其他控制器。您需要提供有关您的应用结构的更多信息,以便我更全面地回答。

    编辑后:

    实现 prepareForSegue 以便您可以将信息传递给您呈现的视图控制器:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        TriggerViewController *dvc = (TriggerViewController *)segue.destinationViewController;
        dvc.tableViewReference = segue.sourceViewController.childViewControllers[0]
    }
    

    这里的 tableViewReference 是您尝试访问 musicPlayer 的控制器中的一个属性(tableViewReference 应该属于 TriggerViewController 类)。然后,在该类中,您可以像这样调用 play:

    [tableViewReference.musicPlayer 播放];

    【讨论】:

    • 这两个视图控制器不相关。
    • @thisiscrazy4,好吧,这让事情变得更加困难,但你仍然需要描述你的结构以便我提供更多帮助。
    • 你想避免循环导入吗?
    • @RamyAlZuhouri,这个问题是针对我还是针对 OP?
    • @rdelmar 我的根视图控制器中嵌入了一个 TableViewController,其中包含该属性。然后我有另一个从根视图控制器推送的视图控制器。推送此视图时,我希望调用 [musicPlayer play],但现在它无法识别 musicPlayer。
    【解决方案2】:

    一种方法是您可以将视图控制器#import 到其他视图控制器并以这种方式访问​​属性。对于情节提要,您可以在父视图和子视图之间使用控制器的 prepareForSegue: 方法。在子视图中尝试类似childView *child = (childView *)segue.destinationViewController;

    【讨论】:

    • 我试过了,但它不起作用。如果我在不同的视图控制器中执行 [musicPlayer play] 之类的操作,它将无法识别 musicPlayer。
    • 由于您使用的是故事板,您可以使用prepareForSegue 方法,查看更新后的答案
    • 当你[musicPlayer play]在另一个控制器中时,你alloc and init视图控制器了吗?请发布有关您的代码的更多信息
    • 不,我没有。我在控制器的 viewDidLoad 函数中调用 [musicPlayer play]。 musicPlayer 正在设置视图控制器中设置,然后我想在其他视图出现时调用它。
    【解决方案3】:

    那么您不必从根视图控制器访问 musicPlayer 属性,而是从表视图控制器访问。所以它会是这样的:

    [rootViewController.containerView.tableViewController.musicPlayer play];
    

    【讨论】:

    • 我收到一条错误消息,在“rootViewController”类型的对象上找不到属性“tableViewController”。
    • 那你还没有解释清楚musicPlayer到底在哪里。您说“我的根视图控制器中嵌入了一个包含属性的 TableViewController”,嵌入是什么意思?那具体在哪里?
    • musicPlayer 属性在 TableViewController 中。嵌入式是指我的根视图控制器中有一个容器视图。并且容器视图连接到一个 TableViewController。此屏幕截图可能会有所帮助.. dropbox.com/s/a8bvgi4rjfv395s/Storyboard.png?m
    • 好的,在我编辑的答案中,我假设您使用了这些变量名,这些变量名非常具有指示性,请尝试看看它是否有效。
    • 我不太清楚如何访问容器视图。我以为我可以做这样的事情,但它不起作用。 [rootViewController.childViewControllers[0].tableViewController.musicPlayer play];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    相关资源
    最近更新 更多