本项目的目的是简化 "屏幕上哪个控制器/视图是显示的" 这背后的代码。
有时,您可能希望将事件分发给当前显示的控制器。例如
对于这些包含通知视图的用法,您可能希望不费吹灰之力地将视图显示到显示的控制器上。更重要的是,即使您从导航控制器中推送新的视图,视图也应该保持显示。
为了清楚起见,本协议仅为您提供获取当前显示的控制器的方法。至于如何利用这个工具去做有益的事,则由您自行决定。示例代码中提供了一个 NotificationView 的示例。请同时参阅 RZNotificationView(即将推出)
请注意,PPTopMostController 也支持模态控制器。
安装 PPTopMostController 最简单的方法是通过 CocoaPods 包管理器,因为它非常灵活并且易于安装。
$ cd /path/to/MyApplication
# If this is a new project, initialize git...
$ git init
$ git submodule add [email protected]:ipodishima/PPTopMostController.git vendor/PPTopMostController
$ git submodule update --init --recursive
您就可以使用了。
PPTopMostController 不关心 ARC 和非 ARC。想做什么就做什么吧!
iOS 4 至 iOS 6
要获取显示在最上面的控制器,只需这样做
UIViewController *c = [UIViewController topMostController];
完成。
示例中使用PPRevealSideViewController。
#import "PPTopMostControllerProtocol.h"
@interface YourContainer (PPTopMostController) <PPTopMostControllerProtocol>
遵守它
那就这么多了!
假设您有一个下载数据的管理器,还有一个在发生错误时触发通知的视图。
(这与使用完成块的思想类似)您会声明一个协议
@protocol DLManagerDelegate
- (void) dlManager:(DLManager*)manager didFailWithError:(NSError*)error;
@end
并为代理创建一个属性
@property (nonatomic, weak) id<DLManagerDelegate> delegate;
在每个控制器中,您都会采用该协议
@interface AController : UIViewController <DLManagerDelegate>
并实现该方法
- (void) dlManager:(DLManager*)manager didFailWithError:(NSError*)error
{
[NotificationView showFromController:self ...];
}
在失败时通知代理
- (void) weFail:(NSError*)error
{
[self.delegate dlManager:self didFailWithError:error];
}
此外,如果更改显示的控制器,请正确重新分配代理
[[DLManager shared] setDelegate:self];
无聊
您会声明通知
extern NSString *const DLManagerDidFailNotification;
+
NSString *const DLManagerDidFailNotification = @"DLManagerDidFailNotification";
在失败时发布它
- (void) weFail:(NSError*)error
{
NSDictionary *userInfo = @{@"error": error};
[[NSNotificationCenter defaultCenter] postNotificationName:DLManagerDidFailNotification object:nil userInfo:userInfo];
}
并在每个控制器中添加观察者
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(dispatchNotificationFail:)
name:DLManagerDidFailNotification
object:nil];
别忘了移除观察者
并实现该方法
- (void) dispatchNotificationFail:(NSNotification*)notif
{
[NotificationView showFromController:self ...];
}
无聊
只需实现DLManager中的weFail:
方法
- (void) weFail:(NSError*)error
{
[NotificationView showFromController:[UIViewController topMostController] ...];
}
不无聊
本代码由Marian Paul代表iPuP SARL以MIT许可证发布。
请在您项目中使用此协议时告诉我!如果您用PPTopMostController构建了很好的控件,请让我知道,我会将链接包含在readme中。
问候
Marian Paul,又名ipodishima