1

我有一个具有多个视图控制器的应用程序,其中一些视图控制器包含运行各种任务的方法。我需要做的是在初始 viewController 加载时,在其他 viewController 中调用这些方法,以便它们在后台运行,但是,我在执行此操作时遇到了一些困难。

假设我有 4 个 viewController,A、B、C 和 D,其中 A 是初始 viewController,在每个 viewController 中,我分别有 aMethod、bMethod、cMethod 和 dMethod。以下是相关代码:

在我打开的viewController(AviewController)里面:

在 .h 文件中:

#import "BViewController"
#import "CViewController"
#import "DViewController"

@interface AViewController:UIViewController {

BViewController *bViewCon;
CViewController *cViewCon;
DViewController *dViewCon;


}

@property (nonatomic, retain) BViewController *bViewCon;
@property (nonatomic, retain) CViewController *cViewCon;
@property (nonatomic, retain) DViewController *dViewCon;

@end

在我的 .m 文件中,我有以下内容:

#import "BViewController"
#import "CViewController"
#import "DViewController"

@implementation AviewController

@synthesize bViewCon, cViewCon, dViewCon;

- (void) viewDidLoad {

[super viewDidLoad];

bViewCon = [[BViewController alloc] init];
[bViewCon bMethod];

...

}

但是,我收到错误消息“'BViewController' 没有可见的@interface 声明选择器'bMethod'”。我需要从这个类(即AViewController)中以相同的方式从其他viewControllers 中调用其他方法。

提前感谢所有回复的人。

4

2 回答 2

5

你考虑过使用NSNotificationCenter吗?在通知上设置方法,并在需要它们运行时对它们执行 ping 操作。如果您的其他视图控制器已实例化且可用,例如隐藏在导航控制器堆栈或单独的选项卡中,这将有所帮助。

要回答有关该错误的问题,您需要在头文件中声明要调用的方法。错误表明它找不到该方法的声明。

通知中心示例

// listen for notifications - add to view controller doing the actions
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mySpecialMethod) name:@"SomeNotificationName" object:nil];

// when you want your other view controller to do something, post a notification
[[NSNotificationCenter defaultCenter] postNotificationName:@"SomeNotificationName" object:nil];

// you don't want this notification hanging around, so add this when you are done or in dealloc/viewDidUnload
[[NSNotificationCenter defaultCenter] removeObserver:self]; // this removes all notifications for this view
// if you want to remove just the one you created, you can remove it by name as well
于 2013-01-02T22:40:05.910 回答
1

要解决您收到的错误,请确保在每个控制器的头 (.h) 文件中声明了所有方法(否则,编译器将无法看到它们)。

由于所有这些控制器都是子控制器AViewController(它们是由AViewController它创建并作为 ivars 保存的),我不会NSNotificationCenter在这里使用(除非还有其他对象需要在某些事件发生时得到通知,这不是拥有AViewController)。

相反,我会按照您的尝试直接调用这些方法。

另一方面,如果这些方法正在启动正在进行的任务(在后台运行任务),最好将方法调用移动init:AViewController. (在 iOS 5 上,可以卸载视图,因此viewDidLoad:可能会多次调用......例如在内存警告和视图被屏蔽的情况下)。我可能会做这样的事情:

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle
{
    self = [super initWithNibName:nibName bundle:bundle];  // your correct stuff here
    if (self)
    {
         bViewCon = [[BViewController alloc] init];
         [bViewCon bMethod];
         // ... and so on for the other controllers
    }
    return self;
}

编辑

虽然,正如评论中所提到的,UIViewControllers 在内存方面并不便宜......老实说,最好将这段代码重构为有一个控制器(NSObject而不是的子类UIViewController,它更便宜)充当将在后台运行的任务的管理器。我想这也可能会在以后对您有所帮助,因为它将有助于划分每个控制器的任务和目的(在这种情况下,UIViewControllers 应该主要负责管理视图(在某些情况下是/视图层次结构)和关联的任务...如果正在进行的任务超出了与所述视图相关的范围,这可能表明UIViewController不应该处理它们...

于 2013-01-02T22:55:13.977 回答