【问题标题】:Swapping views and triggering a method in the other class交换视图并触发另一个类中的方法
【发布时间】:2014-06-14 12:43:36
【问题描述】:

我正在使用情节提要,我希望当用户单击某个按钮 (SwapViewAndTriggerMethod) 时,视图会更改为由第二个视图控制器定义的另一个 (SecondView),然后是 SecondView 中存在的某个方法 (MyMethod) .m 被调用。我正在使用下面的代码,这成功地将我带到另一个视图....但是 MyMethod 没有被调用。请问我怎样才能做到这一点?干杯!

- (IBAction) SwapViewAndTriggerMethod:(id)sender
{
UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondView_storyboard"];

[self presentViewController:controller animated:YES completion:nil];

[instanceOfGS2controlller MyMethod:nil];
}

这是我得到的错误: 警告:尝试在 上显示其视图不在窗口层次结构中! 注意:MyMethod 调用选择器来选择照片并将其分配给图像视图。

【问题讨论】:

  • 在情节提要中,具有该标识符的视图控制器是否指向该对象/视图控制器的实例?此外,在分配 controllers 类型时,我建议将其设置为您的 UIViewControllers 子类名称,而不仅仅是 UIViewController
  • 这是我得到的错误:警告:尝试在 上呈现 ,其视图不在窗口层次结构中!注意:MyMethod 调用选择器来选择照片并将其分配给图像视图。

标签: ios


【解决方案1】:

您不能像这样从另一个控制器调用显示选取器视图控制器的方法,因为正如错误所说,SecondView_ViewController 的视图不在窗口层次结构中。您可以在 SwapViewAndTriggerMethod: 中设置一个标志,并在 SwapViewAndTriggerMethod: 的 viewDidAppear 中使用它来显示选择器,

- (IBAction) SwapViewAndTriggerMethod:(id)sender {
    SecondView_ViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondView_storyboard"];
    [self presentViewController:controller animated:YES completion:nil];
    controller.presentPicker = YES; // presentPicker is a BOOL property that you need to add to SecondView_ViewController
}

然后,在 SecondView_ViewController 中,这样做,

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if (self.presentPicker) 
        // present your picker here
    self.presentPicker = NO;
}

【讨论】:

  • 我在 SecondView_ViewController 中定义了一个 BOOL presentPicker,但是当我编译它时说:在“SecondView_ViewController *”类型的对象上找不到属性“presentPicker”
  • @jeddi,您是否在 .h 文件中声明了该属性?
  • 是的,我做到了。 @interface SecondView_ViewController : UIViewController { BOOL presentPicker; }
  • @jeddi,这不是属性,而是您声明它的方式。所以要么创建一个属性,要么将你的 ivar 称为“presentPicker”而不是“self.presentPicker”。
  • 谢谢。我正在慢慢到达那里.. 我添加了@property (nonatomic, assign) BOOL presentPicker;在 h。并在m中合成。但它不起作用...... :-(
【解决方案2】:

一些事情

1.当你展示一个新的viewController时,它的生命周期开始了,这意味着它的ViewDidLoad(和其他函数)被调用,所以你可以在那里调用你的函数

2.通常,您可以使用 NSNotificationCenter 在您的应用中发布消息,但我不确定这是您的最佳选择

【讨论】:

  • 关于选项 1:我无法在 ViewDidLoad 中始终触发该方法。我希望它仅在调用另一个视图中的方法时触发...
  • 你能解释一下为什么吗?也许您可以在 userDefaults 中保存一个值,说明您是否需要调用该函数
  • 因为我希望用户能够在不调用该方法的情况下切换到该视图,同时从另一个视图切换到该视图并调用该方法。我知道我可以为此目的在 NSUserdefauls 中保存一个标志,但我正在寻找一种更好的类之间的通信方式。我没有使用 NSNotificationCenter 的经验,但同样可能它不是类之间交互的最佳方式。无论如何感谢您的帮助
【解决方案3】:

如果您在调用另一个视图的方法时调用该方法,您有两种选择:(1) 使函数可公开访问iOS: How to define public methods?,或 (2) 使用 -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 并调用视图中的方法确实加载了。

【讨论】:

    猜你喜欢
    • 2016-11-12
    • 2011-01-31
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多