Как передать данные из блока в одном контроллере представления в другой - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь создать почтовый клиент, у меня очень простое GUI в моем приложении:

  • кнопка входа
  • заполнитель электронной почты
  • заполнитель пароля

Я использую библиотеку MailCore2 для извлечения сообщений и т. Д. c. И в какой-то момент я предполагаю, что это очень хорошая идея - передать данные из моего ViewController в мой TableViewController. Итак, я получаю свои сообщения в моем первом ViewController и передаю этот массив моему второму TableViewController, вот как я это делаю:

- (IBAction)loginButtonPressed:(id)sender {
    myTableViewController = [[MyTableViewController alloc] initWithNibName:@"MyTableViewController" bundle:nil];
    [self makeSession:@"zurgsrushmber@gmail.com" withPassword:@"mypassword"];
    [self performSegueWithIdentifier:@"Inbox" sender:self];
}

И мой метод "makeSession":

- (void)makeSession:(NSString *)email withPassword:(NSString *)password {
    MCOIMAPSession *session = [[MCOIMAPSession alloc] init];
    [session setHostname:@"imap.gmail.com"];
    [session setPort:993];
    [session setUsername:email];
    [session setPassword:password];
    [session setConnectionType:MCOConnectionTypeTLS];

    MCOIMAPMessagesRequestKind requestKind = MCOIMAPMessagesRequestKindHeaders;
    NSString *folder = @"INBOX";
    MCOIndexSet *uids = [MCOIndexSet indexSetWithRange:MCORangeMake(1, UINT64_MAX)];

    MCOIMAPFetchMessagesOperation *fetchOperation = [session fetchMessagesOperationWithFolder:folder requestKind:requestKind uids:uids];



    [fetchOperation start:^(NSError * _Nullable error, NSArray * _Nullable fetchMessages, MCOIndexSet * _Nullable vanishedMessages) {

        if (error) {
            NSLog(@"Error downloading message headers:%@", error);
        } else {
//            NSLog(@"The post man delivereth:%@", fetchMessages);
            self->myTableViewController.messages = [[NSArray alloc] initWithArray:fetchMessages];
        }
    }];
    NSLog(@"The post man delivereth:%@", myTableViewController.messages); // Displays "The post man delivereth:(null)"
}

Как вы можете видеть, я использую свой inVar из ViewController.h:

#import <UIKit/UIKit.h>
#import <MailCore/MailCore.h>
#import "MyTableViewController.h"

@interface ViewController : UIViewController
{
    __block MyTableViewController *myTableViewController;
}

@property (weak, nonatomic) IBOutlet UITextField *emailTextField;

@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;


@end

И файл интерфейса моего TableViewController:

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface MyTableViewController : UITableViewController
{
    __block NSArray *messages;
}

@property NSArray *messages;

@end

NS_ASSUME_NONNULL_END

NSLog показывает мне «ноль», если я пытаюсь использовать это вне блока, однако, моя переменная self-> myTableViewController.messages содержит данные, но только внутри блока.

UPDATE: Я пробовал что-то подобное, но получаю бесконечный l oop ...

    __block BOOL finished = NO;
    [fetchOperation start:^(NSError * _Nullable error, NSArray * _Nullable fetchMessages, MCOIndexSet * _Nullable vanishedMessages) {

        if (error) {
            NSLog(@"Error downloading message headers:%@", error);
        } else {
            self->myTableViewController.messages = [[NSArray alloc] initWithArray:fetchMessages];
//            NSLog(@"The post man delivereth:%@", self->myTableViewController.messages);
            finished = YES;
        }
    }];
    while (!finished);
    NSLog(@"The post man delivereth:%@", self->myTableViewController.messages);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...