【问题标题】:iOS: call method from a separate viewControlleriOS:从单独的 viewController 调用方法
【发布时间】:2012-08-28 16:43:26
【问题描述】:

在我的主视图控制器中,我有一个调用弹出框的按钮。由于弹出框有它自己的视图控制器,它的按钮调用弹出框视图控制器中的方法。但是我如何从主视图控制器调用方法呢?

我试过这个。在弹出视图控制器中,我在 .h

中添加了一个属性
@class ViewController;

@interface PopoverContent : UIViewController <UITextFieldDelegate>
...
@property (strong, nonatomic) ViewController *parentView;

在我的 popover 实现中,我在 viewDidLoad 中执行了此操作:

self.parentView = [[ViewController alloc] initWithNibName:nil bundle:nil];

在 ViewController 中我有一个名为 generateHash 的方法,所以我尝试了

[parentView generateHash];

但我得到了错误:

No visible @interface for 'ViewController' declares selector 'generateHash'

知道我做错了什么吗?谢谢

【问题讨论】:

    标签: ios


    【解决方案1】:

    删除这一行,不想创建视图控制器的新实例

    self.parentView = [[ViewController alloc] initWithNibName:nil bundle:nil];
    

    改变这一行

    @property (strong, nonatomic) ViewController *parentView;
    

    到这里,所以你的父视图指针是正确的类类型

    @property (weak) ParentView *parentView;
    

    现在在父视图 .m 文件中

    - (void) createPopup
    {
        PopoverView *popoverV = [[PopoverView alloc] init];
        popoverV.parentView = self;
    
        //And some command to show your popup, addSubview, or presentModal, or whatever
    }
    

    然后在 PopoverView.m 文件中,你可以像这样调用 parentView 的方法

    [self.parentView SomeMethod];
    

    【讨论】:

    • 如果你使用这种方法,对parentView的引用应该是弱的。如果它很强大,您可能最终会得到一个强大的引用循环,并且对象永远不会在 ARC 下被释放。 (是的,我意识到这取决于父级是否有对“子级” PopoverContent 实例的强引用——它现在可能有,或者很可能会在未来修改代码。)
    • 我有点困惑,我注意到当我在弹出视图控制器中声明按钮时,我可以为目标添加self.parentViewController,但没有一个方法被调用。似乎这是最简单的方法(但它似乎不起作用)
    • 和 Mike Maid 一样,你的方法是在标题中声明的吗?从类 2 调用的类 1 中的任何方法都需要在类 1 的 .h 文件中声明,否则类 2 无法“看到”它们。
    • 实际上还有一个问题,我已经解决了这个问题:[self.parentView saveImage]; 那么这应该可行吗?它不... [self.buttonSave addTarget:self.parentView action:@selector(saveImage) forControlEvent....];
    • 似乎应该将 saveImage 定义为“- (void) saveImage{...}”,但如果将其定义为“- (IBAction) saveImage: (id) sender{... }" 你需要添加一个冒号,像这样 ....action:@selector(saveImage:).....
    【解决方案2】:

    这是使用委托协议的好地方。在 PopoverContent.h 中,添加如下内容:

    @protocol PopoverContentDelegate : NSObject
        - (void) method1;
    @end
    

    当然,您可以拥有多个方法,并且这些方法可以像任何其他方法一样返回值并接受参数。此外,在同一个文件中,添加名为delegate 的属性。 (从技术上讲,它可以被称为任何东西,但是如果您将其称为委托,每个查看您的代码的人都会确切地知道您在做什么。)

    @interface PopoverContent
    
    @property (weak) id<PopoverContentDelegate > delegate;
    //other properties and methods
    @end
    

    最后,在“主”视图控制器的 .m 文件中,导入 PopoverContent.h 文件并将委托设置为 self。还要实现 method1 来做任何你需要做的事情。

    //Create the view controller
    myPopoverContentController.delegate = self;
    //Create the popover with the view controller.
    

    现在,在 PopoverContent 控制器中,您可以在任何需要的地方调用委托的 method1。

    [delegate method1];
    

    【讨论】:

      【解决方案3】:

      首先,要回答您的问题,您可能必须在 ViewController.h 文件中定义 generateHash 方法。

      其次,我建议您的设计方法不是最佳的。 generateHash 方法可能需要位于另一个文件中,该文件可以从您的 ViewController 和 Popover 内容控制器中调用。例如考虑另一个objective-c .h/.m 对“MyHashMethods”:

          MyHashMethods.h
      
          + (void)generateHash;
      

          MyHashMethods.m
      
          + (void) generateHash
          {
               // hash code
          }
      

      这将允许您将 MyHashMethods.h 包含在您需要的任何视图控制器中,然后调用

          [MyHashMethods generateHash];
      

      当你需要的时候。

      【讨论】:

        猜你喜欢
        • 2011-07-02
        • 2023-03-03
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多