从应用程序委托调用UIViewController方法

12

我知道这个问题可能有很多类似的,但我的情况有所不同。

当用户返回主屏幕时,(void)applicationDidEnterBackground 会从 AppDelegate 类中被调用。然而,一旦用户按下Home键,我不希望用户再次看到这个视图控制器,所以我有一个名为 (void)goToBeginning 的方法来切换到另一个视图控制器。我想要能够从 AppDelegate 中调用这个方法。我不想使用 NotificationCenter 来解决这个问题。此外,这里提供的解决方案: Calling view controller method from app delegate 对我来说不可行,因为它初始化了一个新的对象,而我想要调用的是已经存在于视图中的对象。我该怎么做?我正在使用iOS 7和XCode 5。


很好的问题+1,我标记为重复,因为这是一个类调用另一个类的所有类似概念,在您的情况下,您想要获取已实例化类(视图控制器)的引用,以便您可以与UI元素交互,例如视图... 我认为原始问题是4年前的,并且有很多观看和投票。 - serge-k
1个回答

42
  1. 通知。但是你不想这样。
  2. 你可以在AppDelegate中获取到你那个viewController的引用,然后在(void)applicationDidEnterBackground中调用那个(void)goToBeginning方法。

例如,在你的ViewController中:

- (void)viewDidLoad
{
    [super viewDidLoad];

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

并且在您的 AppDelegate 中:

@class MyViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (weak, nonatomic) MyViewController *myViewController;

@end

AppDelegate 的实现中:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [self.myViewController goToBeginning];
}

@Bryan 不是我,原帖作者不想要这个。"我实际上不想使用 NotificationCenter"。你应该仔细阅读问题。^_^ - sunkehappy
啊,抱歉。我会删除我的评论。 - Bryan
很好的答案 +1。只使用 AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 会收到编译器的警告,应该改为 AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 参见 https://dev59.com/k2445IYBdhLWcg3wBVrz - serge-k
很棒的答案... - Sipho Koza
1
不错的解决方法,尽管从标题上看,我不明白为什么它被标记为重复 - 另一个标题正好相反。 - Boris Gafurov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接