Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iOS view controller中实现双向通信?_Ios_Objective C - Fatal编程技术网

如何在iOS view controller中实现双向通信?

如何在iOS view controller中实现双向通信?,ios,objective-c,Ios,Objective C,让我先说明一下我的情况。我有一个ViewController,它保留了GameManager的一个实例。GameManager类封装了简单游戏的状态和逻辑。在GameManager中遇到某些状态时,我希望执行一组操作。例如:当游戏结束时,我想显示一个游戏结束对话框。如上所述,游戏逻辑位于GameManager中,但创建和定位新“游戏结束”对话框的方法位于ViewController中。为了允许GameManager“调用”ViewController,我在分配时将对ViewController的

让我先说明一下我的情况。我有一个ViewController,它保留了GameManager的一个实例。GameManager类封装了简单游戏的状态和逻辑。在GameManager中遇到某些状态时,我希望执行一组操作。例如:当游戏结束时,我想显示一个游戏结束对话框。如上所述,游戏逻辑位于GameManager中,但创建和定位新“游戏结束”对话框的方法位于ViewController中。为了允许GameManager“调用”ViewController,我在分配时将对ViewController的引用传递给GameManager,并简单地调用ViewController上的方法。例如:

// GameManager.m
- (void) gameOver {
    [self.viewController showGameOver];
}
我的问题是:这是正确的、客观的方法吗?有没有更纯粹的方法来处理这个问题?我认为使用块可能更合适。

在这里实现委派模式

在游戏管理器中

@protocol MyGameDelegate : <NSObject>

@required

- (void)gameManager(GameManager *)gameManager gameOverWithSuccess:(BOOL)success;

@end
像这样做,但要小心

@property (assign, nonatomic) id <MyGameDelegate> gameDelagate;
在这里,您没有使用strong

最后将gameDelagate设置为您的viewcontroller


希望您已经理解。

不一定是您的问题,但请确保您在self.viewController引用中有一个弱属性。否则,因为viewController会保留gameController,gameController也会保留viewController,所以两者都不会放弃,并且会导致内存泄漏。谢谢您的提示。我也这么想,这太棒了。我真的很感谢你的解释。它像现在一样工作,但我一直在寻找最合适的方式来处理事情。这真的很有帮助。
//  MyGameDelegate implementation

- (void)gameManager(GameManager *)gameManager gameOverWithSuccess:(BOOL)success {

    if (success) [self.viewController showGameOver];
}
@property (assign, nonatomic) id <MyGameDelegate> gameDelagate;