Диплом_DOC (1222512), страница 12
Текст из файла (страница 12)
{
[[NSNotificationCenter defaultCenter] postNotificationName:kAccountsListEmptyNotification object:nil];
}
}
- (void)saveAccountsToKeychain
{
NSError *saveError = nil;
[KeychainUtils updateSavedAccounts:self.accountsFromKeychain forListIdentifier:kKeychainAccountListIdentifier error:&saveError];
if (saveError && saveError.code != -25300)
{
AlfrescoLogDebug(@"Error saving to keychain. Error: %@", saveError.localizedDescription);
}
}
- (void)selectAccount:(UserAccount *)selectedAccount selectNetwork:(NSString *)networkIdentifier alfrescoSession:(id<AlfrescoSession>)alfrescoSession
{
self.selectedAccount = selectedAccount;
for (UserAccount *account in self.accountsFromKeychain)
{
account.selectedNetworkId = nil;
account.isSelectedAccount = NO;
}
selectedAccount.isSelectedAccount = YES;
if ([selectedAccount.accountNetworks containsObject:networkIdentifier])
{
selectedAccount.selectedNetworkId = networkIdentifier;
}
[[NSNotificationCenter defaultCenter] postNotificationName:kSessionReceivedNotification object:alfrescoSession userInfo:nil];
[self saveAccountsToKeychain];
}
- (void)deselectAccount
{
[self.selectedAccount setIsSelectedAccount:NO];
self.selectedAccount = nil;
[self saveAccountsToKeychain];
}
- (NSInteger)totalNumberOfAddedAccounts
{
return self.accountsFromKeychain.count;
}
#pragma mark - Private Functions
- (void)loadAccountsFromKeychain
{
NSError *keychainRetrieveError = nil;
self.accountsFromKeychain = [[KeychainUtils savedAccountsForListIdentifier:kKeychainAccountListIdentifier error:&keychainRetrieveError] mutableCopy];
if (keychainRetrieveError)
{
AlfrescoLogDebug(@"Error in retrieving saved accounts. Error: %@", keychainRetrieveError.localizedDescription);
}
if (!self.accountsFromKeychain)
{
self.accountsFromKeychain = [NSMutableArray array];
}
NSArray *accounts = [NSArray arrayWithArray:self.accountsFromKeychain];
for (UserAccount *account in accounts)
{
if (account.isSelectedAccount)
{
self.selectedAccount = account;
}
}
}
@end
ПРИЛОЖЕНИE Б
(рекомендуемое)
Реализация класса WorkflowViewController
typedef NS_ENUM(NSInteger, WorkflowControllerState)
{
StateMyProcesses = 0,
StateInvolvedProcesses
};
@interface WorkflowViewController ()
@property (strong, nonatomic) id<AlfrescoSession> alfrescoSession;
@property (strong, nonatomic) AlfrescoWorkflowService *workflowService;
@property (assign, nonatomic) WorkflowControllerState currentState;
@property (strong, nonatomic) MBProgressHUD *progress;
@property (strong, nonatomic) UISegmentedControl *control;
@property (strong, nonatomic) NSMutableArray *processDefinitions;
@property (strong, nonatomic) NSMutableArray *myProcesses;
@property (strong, nonatomic) NSMutableArray *myTasks;
@end
@implementation WorkflowViewController
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil alfrescoSession:(id<AlfrescoSession>)session{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.alfrescoSession = session;
self.myProcesses = [NSMutableArray array];
self.myTasks = [NSMutableArray array];
self.processDefinitions = [NSMutableArray array];
self.currentState = StateInvolvedProcesses;
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
if (self.revealViewController) {
[self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
}
[self createServices];
[self setupSegmentedHeader];
[self setupListeningNotifications];
[self initRefreshControl];
[self configureView];
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self updateTableData];
PlaceholderViewController *ph = [[PlaceholderViewController alloc] initWithNibName:NSStringFromClass([PlaceholderViewController class]) bundle:[NSBundle mainBundle]];
[self.splitViewController showDetailViewController:ph sender:self];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)setupListeningNotifications{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showAdhocCreationController:) name:kShowAdhocCreationController object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showReviewCreationController:) name:kShowReviewCreationController object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showParallelReviewCreationController:) name:kShowParallelReviewCreationController object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateTableData) name:kWorkflowControllerNeedsUpdate object:nil];
}
- (void)configureView{
[self.navigationItem setTitle:@"Мои Задачи"];
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addButtonClicked)];
[self.navigationItem setRightBarButtonItem:addButton];
}
- (void)setupSegmentedHeader{
self.control = [[UISegmentedControl alloc] initWithItems:@[@"Мои задачи",@"Созданные мной"]];
[self.control setSelectedSegmentIndex:0];
[self.control setBackgroundColor:[UIColor whiteColor]];
[self.control setTintColor:[[[ColorManager sharedManager] scheme1] objectAtIndex:0]];
[self.control addTarget:self action:@selector(segmentControlValueChanged) forControlEvents:UIControlEventValueChanged];
}
- (void)initRefreshControl {
self.refreshControl = [[UIRefreshControl alloc] init];
self.refreshControl.backgroundColor = [UIColor colorWithRed:0.854 green:0.854 blue:0.854 alpha:1.0];
[self.refreshControl setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Потяните чтобы обновить"]];
[self.refreshControl addTarget:self
action:@selector(updateTableData)
forControlEvents:UIControlEventValueChanged];
}
- (void)createServices{
self.workflowService = [[AlfrescoWorkflowService alloc] initWithSession:self.alfrescoSession];
}
- (void)updateTableData{
self.progress = [[MBProgressHUD alloc] initWithView:self.view];
[self.progress setRemoveFromSuperViewOnHide:YES];
[self.view addSubview:self.progress];
[self.progress show:YES];
AlfrescoListingContext *listingContext = [[AlfrescoListingContext alloc] initWithSortProperty:@"dueAt" sortAscending:YES];
[self.workflowService retrieveProcessesWithListingContext:listingContext completionBlock:^(AlfrescoPagingResult *result,NSError *error){
[self.progress hide:YES];
self.progress = nil;
[self.refreshControl endRefreshing];
if (error == nil) {
[self.myProcesses removeAllObjects];
NSArray *array = result.objects;
for (AlfrescoWorkflowProcess *process in array){
if (([process.initiatorUsername isEqualToString:self.alfrescoSession.personIdentifier])&&(![process.processDefinitionKey isEqualToString:@"activitiInvitationModerated"])) {
[self.myProcesses addObject:process];
[self.tableView reloadData];
}
}
}
else{
NSLog(@"%@",error.description);
}
}];
[self.workflowService retrieveTasksWithListingContext:listingContext completionBlock:^(AlfrescoPagingResult *result, NSError *error){
if (error == nil) {
[self.refreshControl endRefreshing];
[self.myTasks removeAllObjects];
NSArray *array = result.objects;
for (AlfrescoWorkflowTask *task in array) {
if (!task.completed) {
[self.myTasks addObject:task];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"dueAt" ascending:YES];
[self.myTasks sortUsingDescriptors:@[descriptor]];
[self.tableView reloadData];
}
}
}
}];
[self.workflowService retrieveProcessDefinitionsWithCompletionBlock:^(NSArray *array,NSError *error){
if (error == nil) {
[self.processDefinitions removeAllObjects];
for(AlfrescoWorkflowProcessDefinition *some in array){
if ((![some.key isEqualToString:@"activitiReviewPooled"])&&(![some.key isEqualToString:@"activitiParallelGroupReview"])) {
[self.processDefinitions addObject:some];
}
}
}
else{
NSLog(@"%@",error.description);
}
}];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (self.currentState == StateMyProcesses) {
return self.myProcesses.count;
}
else{
return self.myTasks.count;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
WorkflowProcessCell *cell = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([WorkflowProcessCell class]) owner:self options:nil] lastObject];
[self configureCell:cell forIndexPath:indexPath];
return cell;
}
- (void)configureCell:(WorkflowProcessCell *)cell forIndexPath:(NSIndexPath *)indexPath{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setDateFormat:@"d MMMM yyyy"];
if (self.currentState == StateMyProcesses) {
AlfrescoWorkflowProcess *process = [self.myProcesses objectAtIndex:indexPath.row];
[cell.summaryTextView setText:process.summary];
[cell.dueDateLabel setText:[formatter stringFromDate:process.dueAt]];
if ([[[NSDate date] earlierDate:process.dueAt] isEqualToDate:process.dueAt]) {
[cell.dueDateLabel setTextColor:[UIColor redColor]];
}
[cell.priorityImageView setImage:[self imageForPriority:process.priority]];
}
else{
AlfrescoWorkflowTask *task = [self.myTasks objectAtIndex:indexPath.row];
[cell.summaryTextView setText:task.summary];
[cell.dueDateLabel setText:[formatter stringFromDate:task.dueAt]];
if ([[[NSDate date] earlierDate:task.dueAt] isEqualToDate:task.dueAt]) {
[cell.dueDateLabel setTextColor:[UIColor redColor]];
}
[cell.priorityImageView setImage:[self imageForPriority:task.priority]];
}
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
return NO;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
if (self.currentState == StateInvolvedProcesses) {
AlfrescoWorkflowTask *selectedTask = [self.myTasks objectAtIndex:indexPath.row];
WorkflowTaskViewController *taskController = [[WorkflowTaskViewController alloc] initWithNibName:NSStringFromClass([WorkflowTaskViewController class]) bundle:[NSBundle mainBundle] alfrescoSession:self.alfrescoSession workflowTask:selectedTask];
if ([Functions isIPad]) {
UINavigationController *navC = [[UINavigationController alloc] initWithRootViewController:taskController];
[self showDetailViewController:navC sender:nil];
}
else{
[self.navigationController pushViewController:taskController animated:YES];
}
}
else{
AlfrescoWorkflowProcess *process = [self.myProcesses objectAtIndex:indexPath.row];
WorkflowProcessViewController *processController = [[WorkflowProcessViewController alloc] initWithNibName:NSStringFromClass([WorkflowProcessViewController class]) bundle:[NSBundle mainBundle] alfrescoSession:self.alfrescoSession workflowProcess:process];
if ([Functions isIPad]) {
UINavigationController *navC = [[UINavigationController alloc] initWithRootViewController:processController];
[self showDetailViewController:navC sender:nil];
}
else{
[self.navigationController pushViewController:processController animated:YES];
}
}
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
return self.control;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 37.0;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
static WorkflowProcessCell *sizingCell = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sizingCell = (WorkflowProcessCell *)[[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([WorkflowProcessCell class]) owner:self options:nil] lastObject];
});
[self configureCell:sizingCell forIndexPath:indexPath];
[sizingCell setNeedsLayout];
[sizingCell layoutIfNeeded];
CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height + 1.0f;
}
#pragma mark - PrivateMethods















