【问题标题】:How can I call the one method in all the view controllers?如何在所有视图控制器中调用一种方法?
【发布时间】:2013-02-15 23:13:19
【问题描述】:

如何在所有视图控制器中调用一种方法?

viewcontroller1 中的一个方法,例如,

- (void)doSearch
{
   NSLog(@"Search..!");
}

我想从viewcontroller2、viewcontroller3、viewcontroller4、viewcontroller5等调用doSearch方法

如何做到这一点?

【问题讨论】:

  • 你需要明确:这个方法是否引用了包含类的任何实例变量?如果没有,您可以使用以下大多数技术。但是如果引用了实例变量,则需要使用超类或其他一些更复杂的方案。

标签: iphone ios objective-c xcode cocoa-touch


【解决方案1】:

您可以在单独的类中声明它并在所有视图控制器中实例化该类,或者您可以在AppDelegate 中定义此方法并调用所有视图控制器。您可以通过像这样获取它的实例来访问 ViewControllers 中的 AppDelegate

self.appDelegate=(AppDelegate*)[[UIApplication sharedApplication]delegate];

最后像这样调用方法

[self.appDelegate doSearch];

通常最好将通过应用程序共享的所有方法或数据声明在单独的类中并使用此类。我通常在我的应用程序中使用singelton Object 类,在其中定义所有共享数据,最后在所有类中访问

这里是单例类的例子

MyData.h

@interface MyData : NSObject

+(MyData*)getInstance;
-(void)search;

@end

我的数据.m

#import "MyData.h"

@implementation MyData



static MyData *instance =nil;

+(MyData *)getInstance
{

    @synchronized(self)
    {
    if(instance==nil)
        {

        instance= [[MyData alloc]init];
        }
    }
    return instance;
}

-(void)search {
    NSLog(@"search");
}

@end

终于在你的viewController

  MyData *myData=[MyData getInstance];
  [myData search];

【讨论】:

    【解决方案2】:

    您可以在AppDelegate.h 中声明此方法。喜欢

    - (void)doSearch;
    

    并在AppDelegate.m 中实现它

    - (void)doSearch
    {
        //Your Search Logic
    }
    

    然后,像这样创建AppDelegate 实例

    appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    

    使您的项目的.pch 文件如下所示:

    #ifdef __OBJC__
    
        #import <Foundation/Foundation.h>
        #import <UIKit/UIKit.h>
    
        #import "AppDelegate.h"
        AppDelegate *appDelegate;
    
    #endif
    

    现在,从任何ViewController,您可以调用如下方法:

    [appDelegate doSearch];
    

    快乐编码。

    注意:就我个人而言,我避免在AppDelegate 类中进行这种实现。 我使用单例对象模式来实现这种目的。但是,Given 是最快的方法。

    ___________EDIT__ __________

    添加NSObject 类型的新类文件:将其命名为CommonMethod(或任何您想要的名称)

    CommonMethod.h

    @interface CommonMethods : NSObject
    + (CommonMethods *)sharedObject;
    + (void)doSearch;
    

    CommonMethod.m

    #import "CommonMethods.h"
    
    @implementation CommonMethods
    
    + (CommonMethods *)sharedObject 
    {
        static dispatch_once_t once;
        static CommonMethods *sharedObject;
        dispatch_once(&once, ^ { sharedObject = [[CommonMethods alloc] init]; });
        return sharedObject;
    }
    
    + (BOOL)doSearch
    {
        // Your Search Logic.
    }
    

    现在,将#import "CommonMethods.h" 添加到您项目的.pch 文件中。

    你们都准备好了……!!!

    方法调用(在您的任何 viewController 中):[CommonMethods doSearch];

    【讨论】:

    • 谢谢马特。你能给出单例方法的示例代码吗?
    • @Matt : 只调用一个方法需要共享实例吗?
    • @LithuT.V 如果您彻底看到我的答案,我没有将其共享实例用于(类)方法调用。只是,如果用户想要创建一个可以从任何地方调用的实例方法。感谢您指出。
    【解决方案3】:

    将所有控制器放在NSArray * 中,假设它称为controllerArray

    然后你可以让所有控制器执行选择器:

    [controllerArray makeObjectsPerformSelector:@selector(doSearch)];
    

    【讨论】:

    • 恐怕,这需要先初始化所有的控制器。否则,它将在nil 对象上调用,这将不提供任何结果。
    • 当然,它们必须被初始化。这并不意味着必须加载他们的视图。
    • 有不同的观点;我真的不喜欢初始化applicationDidFinishedLaunchingWithOptions中的所有VC;个人意见,仅此而已。
    • 无需在应用程序启动时这样做。每当您初始化某个 VC 时,您都会将其添加到 controllersArray(使其成为 NSMutableArray)。无论哪种方式:在您想调用某个 VC 的 doSearch 选择器之前,您必须对其进行初始化。
    • 通常有很多方法可以解决某个问题。并不总是一个比另一个更好:)
    【解决方案4】:

    将您的方法添加到AppDelegate.m 文件

    - (void)doSearch
    {
       NSLog(@"Search..!");
    }
    

    然后将#import "AppDelegate.h" 添加到您要调用的UIViewController 中:

    你可以调用方法,

    AppDelegate *del = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    [del performSelector:@selector(doSearch) withObject:nil afterDelay:0];
    

    来自任何UIViewController

    【讨论】:

    • 不声明AppDelegate.h中的方法怎么会被其他类访问??
    • @Matt-检查我编辑的答案:)
    • 我的意思是说你需要在 AppDelegate.h 中声明 - (void)doSearch; 以使该方法对任何 ViewController 可见。
    【解决方案5】:

    你可能喜欢阅读下面的教程

    Global functions and variables in Objective C

    或者您可以在 appDelegate 类中创建可以通过所有应用程序访问的方法。例如,在您的 AppDelegate.h 中,您已将该方法声明如下:

    -(void)myMethod;
    

    在您的 AppDelegate.m 中,您将其定义为:

    -(void)myMethod
    {
        NSLog(@"myMethod is getting called");
    }
    

    从任何其他类(Master 或 Detail 等),您可以通过以下方式访问 myMethod:

    #import "AppDelegate.h"
    
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    [appDelegate myMethod];
    

    【讨论】:

      【解决方案6】:

      制作AbstractViewController 并在其中添加所有常见行为或方法的最佳方式。任何ViewController 都会继承Abstract 并且可以调用任何通用方法

      【讨论】:

        【解决方案7】:

        最好的方法是制作一个单独的头文件,使这个方法成为一个类方法,你可以通过导入类在项目的任何地方调用它。你可以将这个类包含到你的pch文件中,这样就可以避免从所有风投

        class.h
        
        + (void)doSearch
        {
           NSLog(@"Search..!");
        }
        

        在视图控制器中

        #import "class.h"
        
            
        -(void)someMethod
        {
            [class doSearch];
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-20
          • 1970-01-01
          相关资源
          最近更新 更多